Я подклассифицирую встроенный UserCreationForm
из django.contrib.auth.forms
. Я использую crispy_form.helper
и crispy_form.layout
для создания моих форм внутри forms.py. Я также использую modelForm
, но получаю ошибку userCreationForm has no attribute: _errors
. Я не уверен почему. Насколько я могу судить, основываясь на похожих проблемах, это было связано с тем, что не звонил super()
, но я делаю это
forms.py
class UserRegisterForm(UserCreationForm):
class Meta:
model = User
fields = ['first_name', 'last_name', 'username', 'email', 'password1', 'password2', 'month', 'day', 'year', ]
def __init__(self, *args, **kwargs):
super(UserRegisterForm).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.render_hidden_fields = True
self.helper.layout = Layout(
Row(
Column('first_name', css_class='form-group col-sm-6'),
Column('last_name', css_class='form-group col-sm-6'),
css_class='form-row'
),
Row(
Column('email', css_class='form-group col-sm-6'),
Column('username', css_class='form-group col-sm-6'),
css_class='form-row'
),
Row(
Column('month', css_class='form-group col-sm-4'),
Column('day', css_class='form-group col-sm-4'),
Column('year', css_class='form-group col-sm-4'),
css_class='form-row'
),
'password1',
'password2',
)
email = forms.EmailField()
first_name = forms.CharField()
last_name = forms.CharField()
month = forms.CharField(widget=forms.Select(choices=months))
day = forms.CharField(max_length=2)
year = forms.CharField(max_length=4)
def clean(self):
...
def save(self, commit=True):
user = super(UserRegisterForm, self).save(commit=False)
....
if commit:
user.save()
views.py
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Account Created for {username}. You are now able to log in.')
return redirect('login')
else:
messages.warning(request, '...')
else:
form = UserRegisterForm()
return render(request, 'users/register.html', {'form': form})
Шаблон
{{form|crispy}}