Основная проблема заключается в том, что вы используете 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] .Так как в противном случае, если база данных взломана, пароли могут быть легко восстановлены.