Django: ошибки не отображаются при отправке формы

clean не показывает ошибки в моей форме входа в систему независимо от того, что я ввожу, и независимо от того, какой метод отображения ошибок я пытаюсь использовать в clean.

В моем CustomUserCreationForm отображение ошибок работает отлично. Единственная разница между ними заключается в том, что логин расширяет формы. Форма, в то время как Custom расширяет UserCreationForm

Также я использую django-crispy-forms для отображения своих форм.

class LoginForm(forms.Form):
    username = forms.CharField(label=('UserName'),
            widget = forms.TextInput(attrs={'placeholder': _('Username')})
    )
    password = forms.CharField(label=('Password'),
            widget=forms.PasswordInput(attrs={'placeholder' : _('Password') }),
    )

    def helper(self):
            helper = FormHelper()

            helper.form_id = "Login"
            helper.form_method = "POST"
            helper.layout = Layout(Div(
                    Field('username', css_class='input-box-rounded'),
                    Field('password', css_class='input-box-rounded'),
                    Submit('Login', 'Login',  css_class='col-md-6 col-md-offset-3 rounded'),
                     css_class='col-md-4 col-md-offset-4 centered-div'))
            return helper

    def clean(self):

            cleaned_data = super(LoginForm, self).clean()

            if 'username' not in cleaned_data:
                    msg = _("Please enter a username")
                    self._errors['username'] = self.error_class([msg])
            if 'password' not in cleaned_data:
                    msg = _("Please enter a password")
                    raise forms.ValidationError(msg)
            u =authenticate(username = cleaned_data['username'], password = cleaned_data['password'])
            if u == None:
                    msg = _("Username or Password is incorrect")
                    self.add_error('username', msg)

            return cleaned_data

person Charles Haro    schedule 13.02.2014    source источник


Ответы (1)


Можете ли вы опубликовать код вашего представления и шаблона? Не видя ни одного из них, я предполагаю, что либо ваш шаблон должен отображать ошибки, либо ваше представление не обрабатывает форму, хотя я не использовал Django Crispy Forms.

{{ form.non_field_errors }}
{{ form.username.errors }}

К вашему сведению, предпочтительный способ обработки проверки ошибок — создать чистую функцию для каждого поля и заставить ее вызывать ValidationError при возникновении проблемы. Тогда это будет ошибка поля (вторая строка выше).

def clean_password(self):
    data = self.cleaned_data.get('password')
    if not data:
        raise ValidationError(_("Please enter a password"))

Кроме того, поскольку вы просто проверяете наличие поля, вы можете установить required=True для каждого обязательного поля и пропустить ручную проверку.

class LoginForm(forms.Form):
    username = forms.CharField(label=('UserName'), required=True,
        widget = forms.TextInput(attrs={'placeholder': _('Username')})
    )
    password = forms.CharField(label=('Password'), required=True,
        widget=forms.PasswordInput(attrs={'placeholder' : _('Password') }),
    )

Дополнительную информацию см. в документации: https://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template

person doughyde    schedule 14.02.2014