Django权限在管理员之外并以自定义形式存在
我有一个应用程序,有2个用户级别;超级用户和工作人员。超级用户将登录到此应用程序并创建一个新用户,并为该用户分配超级用户或员工权限,但他们不是通过默认的Django管理员登录,而是登录到自定义管理员。如何在表单中显示权限复选框,以及如何为正在创建的新用户保存这些复选框?这仅仅是一个普通的复选框,还是我需要覆盖一些东西才能实现这一点 这是我现在的CreateUserFormDjango权限在管理员之外并以自定义形式存在,django,django-forms,Django,Django Forms,我有一个应用程序,有2个用户级别;超级用户和工作人员。超级用户将登录到此应用程序并创建一个新用户,并为该用户分配超级用户或员工权限,但他们不是通过默认的Django管理员登录,而是登录到自定义管理员。如何在表单中显示权限复选框,以及如何为正在创建的新用户保存这些复选框?这仅仅是一个普通的复选框,还是我需要覆盖一些东西才能实现这一点 这是我现在的CreateUserForm class CreateUserForm(forms.Form): username = forms.EmailFi
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%,但它应该足以给出一个想法。伟大的解决方案,并感谢有关编辑的额外信息。