Получение объекта "Form" не имеет атрибута _errors при создании подкласса UserCreationForm - PullRequest
0 голосов
/ 11 февраля 2020

Я подклассифицирую встроенный 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}}
...