Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django权限在管理员之外并以自定义形式存在_Django_Django Forms - Fatal编程技术网

Django权限在管理员之外并以自定义形式存在

Django权限在管理员之外并以自定义形式存在,django,django-forms,Django,Django Forms,我有一个应用程序,有2个用户级别;超级用户和工作人员。超级用户将登录到此应用程序并创建一个新用户,并为该用户分配超级用户或员工权限,但他们不是通过默认的Django管理员登录,而是登录到自定义管理员。如何在表单中显示权限复选框,以及如何为正在创建的新用户保存这些复选框?这仅仅是一个普通的复选框,还是我需要覆盖一些东西才能实现这一点 这是我现在的CreateUserForm class CreateUserForm(forms.Form): username = forms.EmailFi

我有一个应用程序,有2个用户级别;超级用户和工作人员。超级用户将登录到此应用程序并创建一个新用户,并为该用户分配超级用户或员工权限,但他们不是通过默认的Django管理员登录,而是登录到自定义管理员。如何在表单中显示权限复选框,以及如何为正在创建的新用户保存这些复选框?这仅仅是一个普通的复选框,还是我需要覆盖一些东西才能实现这一点

这是我现在的CreateUserForm

class CreateUserForm(forms.Form):
    username = forms.EmailField(max_length=50)
    email = forms.EmailField()
    first_name = forms.CharField(max_length=150)
    last_name = forms.CharField(max_length=150)
    password1 = forms.CharField(max_length=30, widget=forms.PasswordInput(render_value=False), label='Password')
    password2 = forms.CharField(max_length=30, widget=forms.PasswordInput(render_value=False), label='Password Confirmation')
    address_1 = forms.CharField(max_length=50)
    address_2 = forms.CharField(max_length=50)
    city = forms.CharField(max_length=50)
    province = forms.CharField(max_length=2)
    country = forms.CharField(max_length=50)
    postal_code = forms.CharField(max_length=10)
    work_phone = forms.CharField(max_length=20)
    mobile_phone = forms.CharField(max_length=20)
    fax = forms.CharField(max_length=20)
    url = forms.CharField()
    comments = forms.CharField(widget=forms.Textarea)

    def clean_username(self):
        try:
            User.objects.get(username=self.cleaned_data['username'])
        except User.DoesNotExist:
            return self.cleaned_data['username']
        raise forms.ValidationError("Sorry, this username has already been taken. Please choose another.")

    def clean_email(self):
        try:
            User.objects.get(email=self.cleaned_data['email'])
        except User.DoesNotExist:
            return self.cleaned_data['email']
        raise forms.ValidationError("Sorry, this email has already been taken. Please choose another.")

    def clean(self):
        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
            if self.cleaned_data['password1'] != self.cleaned_data['password2']:
                raise forms.ValidationError("You must type the same password each time.")
            if ' ' in self.cleaned_data['username']:
                raise forms.ValidationError("username must not contain spaces")
        return self.cleaned_data

    def save(self):
        new_user = User.objects.create_user(
            username = self.cleaned_data['username'],
            email = self.cleaned_data['email']
        )
        new_user.first_name = self.cleaned_data['first_name']
        new_user.last_name = self.cleaned_data['last_name']
        new_user.set_password(self.cleaned_data['password'])
        new_user.is_active = True
        new_user.save()

    new_profile = UserProfile(
        # TODO:
    )

谢谢

如果您指的是is_员工和is_超级用户的权限复选框,那么您最好使用带有用户模型的模型表单。这将自动为您解决所有问题

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        exclude = ('last_login', 'date_joined')
编辑每次操作更新:您只需为is_superadmin和is_staff(或以不同方式命名)的表单添加2个
表单.BooleanField()
字段,就像您已经在保存方法中做的那样,您可以执行
新建用户.is_staff=self.cleaned_数据['is_staff']
。您可以考虑使用选择字段,而不是W/A下拉W/3条目,“正常用户”、“工作人员用户”、“管理员用户”,然后根据用户的选择设置ISHOffice和ISSuffAdmin。 还可以在用户模型上使用ModelForm,只需添加必要的额外字段。这可能值得,也可能不值得,这取决于你的习惯


关于表单的另一个注意事项-当涉及到编辑现有用户时,这将无法用于当前用户名/电子邮件上的清除方法。但是,如果您调整这些参数,将当前实例(如果已设置)从查找中排除,您将能够使用此表单编辑现有用户(尽管由于它不是模型表单,您需要手动填充初始数据)。

Dan,我在该表单中有一系列其他自定义内容,以及每个用户的自定义userprofile模型。这不是一个问题吗?很难说没有看到一些代码;也许可以用你到目前为止所做的来更新帖子。它还没有完成,可能是90%,但它应该足以给出一个想法。伟大的解决方案,并感谢有关编辑的额外信息。