Объект 'BooleanField' не имеет атрибута 'attrs' - PullRequest
0 голосов
/ 18 мая 2019

Я получаю сообщение об ошибке: объект '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']

1 Ответ

0 голосов
/ 19 мая 2019

Основная проблема заключается в том, что вы используете BooleanField в качестве виджета для BooleanField.Действительно, вы пишете:

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

    # ...

A BooleanField - это , а не a widget , поэтому вы не можете использовать его в качестве виджета.Виджет по умолчанию - CheckboxInput [Django-doc] .Если вы используете этот виджет, вам не нужно указывать его, в противном случае вы можете указать другой виджет .Не поле формы, как:

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

    # ...

При этом ваш код показывает много анти-паттернов.Например, вы отображаете шаблон для запроса POST, даже если форма успешна.Сделав это, пользователь может обновить браузер и отправить форму во второй раз.Вы должны использовать шаблон Post / Redirect / Get [wiki] здесь.

Вы не должны написать эту шаблонную логику в своемвместо этого вы можете использовать CreateView:

from django.views.generic.edit import <b>CreateView</b>
from django.urls import reverse_lazy

class createuser(CreateView):
    form_class = AddUser
    template_name = 'Account/userlist_form.html'
    success_url = <b>reverse_lazy('some_view')</b>

Здесь CreateView позаботится о форме, вам нужно будет только указать имя представления, на которое вы будете перенаправлятьесли форма удачна.

Модели Django обычно единичны и не имеют суффикса, который делает их коллекцией, поэтому лучше назвать свою модель User вместо User_list.

Имя класса Form обычно заканчивается суффиксом Form.Также обычно не указывает метод, поскольку вы можете «повторно использовать» форму для обновления экземпляра модели, поэтому, вероятно, лучше назвать вашу форму UserForm вместо AddUser.

Ваше createuser представление на основе классов является классом, что означает, что оно должно следовать руководству по стилю PEP-8 [PEP-8] .Кроме того, здесь может быть лучше использовать суффикс View, поэтому лучше использовать имя CreateUserView вместо createuser.

Здесь вы, вероятно, сохраните пароль в модели User, если вынужно только обновить и проверить пароли, вам лучше хешировать эти пароли [Django-doc] .Так как в противном случае, если база данных взломана, пароли могут быть легко восстановлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...