0

我有一个有 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:
    )

谢谢

4

1 回答 1

2

如果您指的是 is_staff 和 is_superuser 的权限复选框,那么您最好使用带有 User 模型的 ModelForm。这将自动为您处理一切。

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        exclude = ('last_login', 'date_joined')

每次 OP 更新编辑:您可以forms.BooleanField()在表单中为 is_superadmin 和 is_staff 添加 2 个字段(或以不同的方式命名它们),就像您已经在 save 方法中所做的一样new_user.is_staff = self.cleaned_data['is_staff']。您可以考虑使用一个选择字段,一个带有 3 个条目的下拉列表,“普通用户”、“员工用户”、“管理员用户”,然后根据用户的选择设置 is_staff 和 is_superadmin。

仍然可以在 User 模型上使用 ModelForm 并添加必要的额外字段。这对您来说可能值得,也可能不值得,这取决于您获得的定制程度。

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

于 2012-06-21T16:00:43.923 回答