Определить природу ошибки поля в формах Django - PullRequest
1 голос
/ 13 мая 2011

2 типа ошибок валидации, которые может иметь поле формы в django: 'обязательный' и 'недействительный'. Есть ли способ узнать, какая из этих двух ошибок произошла из шаблона? Что-то вроде

{% if form.username.errors %}
{% for error in form.username.errors %}
{% if error.required %}
Please enter the username
{% else %}
{{ error }}
{% endif %}

Я просто хочу переопределить сообщение об ошибке для «требуемой» ошибки, то есть я хочу отобразить свое собственное сообщение об ошибке, если эта ошибка произойдет. Я использую django.contrib.auth.views, который использует django.contrib.auth.forms.AuthenticationForm, который я не хочу пытаться настроить.

Ответы [ 2 ]

2 голосов
/ 16 июля 2012

Надеюсь, вы ищете этот тип дескриптора в HTML-шаблон

{% for x in form.errors %}
    {%if "__all__" in x %}
        Wrong username and password
    {%else%}
        {%if "username" in x %}
            Requires username
            <br>
        {%endif%}
        {%if "password" in x %}
            Requires Password
            <br>
        {%endif%}
    {%endif%}
{%endfor%}

Сообщения будут печататься так на вашей странице входа в систему

Требуется имя пользователя Требуется пароль

Неверное имя пользователя и пароль

1 голос
/ 14 мая 2011

Вы действительно должны просто переопределить форму аутентификации. Представление принимает аргумент, который позволяет вам легко переопределять форму.

Я думаю, что-то вроде этого должно работать:

Все, что вам нужно сделать, это переопределить метод clean_username следующим образом: Редактирование:

переопределение метода clean_username не может изменить сообщение об ошибке проверки из-за следующего из form and field validation docs:

  • Метод clean () для поля подкласс. Это ответственно за запустить to_python, проверить и run_validators в правильном порядке и распространять свои ошибки. Я толстый в любое время, любой из методов поднять ValidationError, проверка прекращается и эта ошибка возникает. Этот метод возвращает чистые данные, которые затем вставлен в cleaned_data словарь вида.

  • Метод clean_<fieldname>() в подкласс формы - где находится заменено на название формы атрибут поля. Этот метод делает любой уборка, которая является специфической для этого конкретный атрибут, не связанный с тип поля это. Этот метод не передано никаких параметров. Ты сможешь нужно посмотреть значение поля в self.cleaned_data и помните, что это будет объект Python в этом точка, а не оригинальная строка представлены в форме (это будет в cleaned_data потому что общее поле Метод clean (), выше, уже очистил данные один раз).

Подкласс Field проверяется первым и возвращает очищенные данные, которые используются для метода clean_<field_name>(). Если возникает ошибка, проверка этого поля прекращается.

Это означает, что для переопределения сообщения вам необходимо либо переопределить проверку поля, либо сделать так, чтобы поле не требовало значения, чтобы на этом шаге не возникала ошибка проверки и вызывать необходимый метод в clean_<fieldname>() методе

>>> from django.contrib.auth.forms import AuthenticationForm
>>> class MyAuthForm(AuthenticationForm):
...     def __init__(self, *args, **kwargs):
...         super(MyAuthForm, self).__init__(*args,**kwargs)
...         self.fields['username'].error_messages['required']='Custom Required Msg'
... 
>>> form = MyAuthForm(data={'password':'asdf'})
>>> form.is_valid()
False
>>> form.errors
{'username': [u'Custom Required Msg']}
>>> 

urls.py

from someapp.forms import MyAuthForm

urlpatterns = patterns('',
    ...
    (r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'someapp/login.html', 'authentication_form':MyAuthForm, }),
    ...
...