答案 0 :(得分:0)
这里的主要问题是您将BooleanField
的{{1}}用作 widget 。确实,您写道:
BooleanField
class AddUser(forms.ModelForm):
password = forms.CharField(widget= forms.PasswordInput)
date_of_join = forms.DateField(widget=forms.SelectDateWidget)
superuser = forms.BooleanField(
不是小部件,而是不是,因此您不能将其用作小部件。默认窗口小部件为widget=forms.BooleanField)
# ...CheckboxInput
[Django-doc]。如果使用该窗口小部件,则无需指定它,否则可以指定另一个 widget 。不是表单字段,例如:
BooleanField
话虽如此,您的代码显示了很多反模式。例如,即使表单成功,您也将为POST请求呈现模板。这样,用户可以刷新浏览器,然后再次提交表单。您应在此处使用Post/Redirect/Get pattern [wiki]。
您不需要在您的视图中需要编写此样板逻辑,您可以改用class AddUser(forms.ModelForm):
password = forms.CharField(widget= forms.PasswordInput)
date_of_join = forms.DateField(widget=forms.SelectDateWidget)
superuser = forms.BooleanField(widget=forms.CheckboxInput)
# ...
:
CreateView
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
class createuser(CreateView):
form_class = AddUser
template_name = 'Account/userlist_form.html'
success_url = reverse_lazy('some_view')
将处理表单,您只需填写视图名称即可在表单成功的情况下重定向到该视图。
Django模型通常是单数形式,并且没有使它们成为集合的后缀,因此最好将模型命名为CreateView
而不是 。User
User_list
类的名称通常以Form
后缀结尾。指定方法通常也是 not ,因为您可以“重用”表单来更新模型实例,所以最好将表单命名为Form
,而不是 。UserForm
您的AddUser
基于类的视图是一个类,因此这意味着它应遵循PEP-8 style guide [PEP-8]。此外,最好在这里使用后缀createuser
,所以最好使用名称View
而不是CreateUserView
。
您可能在这里将密码存储在createuser
模型中,如果只需要更新和验证密码,则最好hash these passwords [Django-doc]。否则,如果数据库被黑客入侵,则可以轻松检索密码。