【问题标题】:'BooleanField' object has no attribute 'attrs'“BooleanField”对象没有属性“attrs”
【发布时间】:2019-05-18 17:09:10
【问题描述】:

我收到错误“BooleanField”对象没有属性“attrs” 我正在创建一个表单来创建一个新用户并将详细信息保存在数据库中

搜索了一段时间,但没有运气 添加用户源代码 enter code here

class AddUser(forms.ModelForm):
password=forms.CharField(widget= forms.PasswordInput)
date_of_join=forms.DateField(widget=forms.SelectDateWidget)
superuser=forms.BooleanField(widget=forms.BooleanField)
class Meta:
    model=User_list
      fields=['first_name','last_name','email','password','date_of_join','superuser'  ]
{% for field in form %}
<div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
        <span class="text-danger small">{{field.errors}} </span>
    </div>
    <label class="control-label col-sm-2">{{ field.label_tag }}      </label>
    <div class="col-sm-10">{{field}}</div>
</div>
{% endfor %}

field.label_tag 显示布尔字段错误

错误是这样的

 id_ = widget.attrs.get('id') or self.auto_id
AttributeError: 'BooleanField' object has no attribute 'attrs'

观点:

class createuser(View):
    form_class=AddUser
    template_name='Account/userlist_form.html'

    def get(self,request):
        form=self.form_class(None)
        return render(request,self.template_name,{'form':form})

    def post(self,request):
        form=self.form_class(request.POST)
        if form.is_valid():
            user=form.save(commit=False)
            user.save()
        return render(request,self.template_name,{'form':form})

还有我的表格:

class AddUser(forms.ModelForm):
    password=forms.CharField(widget= forms.PasswordInput)
    date_of_join=forms.DateField(widget=forms.SelectDateWidget)
    superuser=forms.BooleanField(widget=forms.BooleanField)

    class Meta:
        model=User_list
        fields=['first_name','last_name','email','password','date_of_join','superuser']

【问题讨论】:

  • 看起来您可能在表单中使用了模型字段而不是表单字段。你能分享你的表单代码吗?
  • class createuser(View): form_class=AddUser template_name='Account/userlist_form.html' def get(self,request): form=self.form_class(None) return render(request,self.template_name ,{'form':form}) def post(self,request): form=self.form_class(request.POST) if form.is_valid(): user=form.save(commit=False) user.save() return渲染(请求,self.template_name,{'form':form})
  • edit你的问题与AddUser类的源代码。
  • 能否请edit 提出问题并分享formAddUser 类)的代码。
  • 类 AddUser(forms.ModelForm): password=forms.CharField(widget= forms.PasswordInput) date_of_join=forms.DateField(widget=forms.SelectDateWidget) superuser=forms.BooleanField(widget=forms. BooleanField) class Meta: model=User_list fields=['first_name','last_name','email','password','date_of_join','superuser']

标签: html django django-models


【解决方案1】:

这里的主要问题是您使用BooleanField 作为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)

    # ...

BooleanField 不是 小部件,因此您不能将它用作小部件。默认小部件是CheckboxInput [Django-doc]。如果您使用该小部件,则无需指定它,否则您可以指定另一个 小部件。不是表单域,例如:

class AddUser(forms.ModelForm):
    password = forms.CharField(widget= forms.PasswordInput)
    date_of_join = forms.DateField(widget=forms.SelectDateWidget)
    superuser = forms.BooleanField(widget=forms.CheckboxInput)

    # ...

话虽如此,您的代码显示了很多反模式。例如,即使表单成功,您也会为 POST 请求呈现模板。通过这样做,用户可能会刷新浏览器,并再次提交表单。你应该在这里使用Post/Redirect/Get pattern [wiki]

您确实不需要在您的视图中编写此样板逻辑,您可以使用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')

这里CreateView 将处理表单,您只需填写表单成功时将重定向到的视图的名称。

Django 模型通常是单数的,并且没有使它们成为集合的后缀,因此您最好将模型命名为 User 而不是 User_list

Form 类的名称通常以 Form 后缀结尾。指定方法也很常见,因为您可以“重用”表单来更新模型实例,因此最好将表单命名为 UserForm,而不是 @ 987654339@.

您的createuser 基于类的视图是一个类,这意味着它应该遵循PEP-8 style guide [PEP-8]。此外,在这里使用View 后缀可能会更好,因此您最好使用名称CreateUserView 而不是createuser

您这里可能在User模型中存储了一个密码,如果您只需要更新和验证密码,您最好hash these passwords [Django-doc]。因为否则如果数据库被黑客入侵,密码很容易被找回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2021-08-03
    相关资源
    最近更新 更多