'BooleanField'对象没有属性'attrs'

时间:2019-05-18 17:09:10

标签: html django django-models

我收到错误“ BooleanField”对象没有属性“ attrs”的信息 我正在创建一个表单以创建一个新用户并将详细信息保存在数据库中 搜寻了一段时间但没有运气 添加用户源代码     在此处输入代码 类AddUser(forms.ModelForm): password = forms.CharField(widget = forms.PasswordInput) date_of_join = forms.DateField(widget = forms.SelectDateWidget) superuser = forms.BooleanField(小部件= forms.BooleanField) 类Meta:     型号=用户列表       fields = ['first_name','last_name','email','password','date_of_join','superuser'] {%为表格%的字段}
    
         {{field.errors}}     
         
{{field}}
{%endfor%} field.label_tag显示布尔字段错误 错误是这个  id_ = widget.attrs.get('id')或self.auto_id AttributeError:'BooleanField'对象没有属性'attrs' 风景: class createuser(View):     form_class =添加用户     template_name ='帐户/userlist_form.html'     def get(self,request):         form = self.form_class(无)         返回render(request,self.template_name,{'form':form})     def post(自我,要求):         form = self.form_class(request.POST)         如果form.is_valid():             user = form.save(commit = False)             user.save()         返回render(request,self.template_name,{'form':form}) 和我的表格: 类AddUser(forms.ModelForm):     password = forms.CharField(widget = forms.PasswordInput)     date_of_join = forms.DateField(widget = forms.SelectDateWidget)     superuser = forms.BooleanField(小部件= forms.BooleanField)     类Meta:         型号=用户列表         fields = ['first_name','last_name','email','password','date_of_join','superuser']

1 个答案:

答案 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]。否则,如果数据库被黑客入侵,则可以轻松检索密码。