Почему пользовательские сообщения об ошибках формы не отображаются в Django 1.11? - PullRequest
0 голосов
/ 27 июня 2019

Когда я впервые построил свое приложение с Django 1.8, я смог создать пользовательские сообщения об ошибках формы, такие как:

# forms.py
class UserProfileForm(forms.ModelForm):

    user_age = forms.IntegerField(
        label = 'Your age',
        error_messages = {'required': 'Please enter your age},
        widget  =  forms.NumberInput(attrs={'class': 'form-control'}))


# create_user_profile.html
<form method="post" action=".">
{% csrf_token %}

<div class="form-group form-errors">
    {% if form.errors %}
        <p class="errornote">
        {% if form.errors.items|length == 1 %}
            Please correct the error below.
        {% else %}
           Please correct the errors below.
        {% endif %}
        </p>
    {% endif %}
</div>

<div class="form-group form-errors">
    {% if form.non_field_errors %}
        {% for error in form.non_field_errors %}
            <p class="errornote">
            {{ error }}
            </p>
        {% endfor %}
    {% endif %}
</div>

<div class="form-group">
    <label for="id_user_age">Your age</label>
    {{ form.user_age.errors }}
    {{ form.user_age }}
</div>

Если пользователь не заполнил свое поле формы 'user_age', на странице шаблона будет отображаться сообщение об ошибке в верхней части страницы и сообщение об ошибке для этого поля формы, например:

Please correct the error below.

Your age
Please enter your age
+--------------------+
|                    |
+--------------------+

Однако я недавно обновил Django 1.8 до Django 1.11 и понял, что мои сообщения об ошибках в пользовательской форме больше не отображаются. Вместо этого, если пользователь не вводит свой возраст в это поле формы в Django 1.11, вместо него отображается общее сообщение «пузырь», которое содержит восклицательный знак:

Your age
+--------------------+
|                    |
+--------------------+
      ! Please fill out this field

Это происходит во всех моих настольных браузерах, Safari, Firefox, Chrome, Brave и т. Д.

Я не помню, чтобы читал об этом изменении в примечаниях к выпуску, когда переходил с Django 1.8 на 1.11 (хотя, возможно, я его пропустил). Что здесь происходит? Как мне заставить Django 1.11 отображать мои сообщения об ошибках в пользовательских полях формы, как это было в Django 1.8.

1 Ответ

0 голосов
/ 30 июня 2019

Как отметил Дэниел Роузман, поведение, которое я видел, было вызвано проверкой HTML5 на стороне клиента.Никакие данные даже не передавались обратно на сервер, так что моя пользовательская проверка формы могла быть запущена.Это новое поведение было введено в Django 1.10. документация состояний,

Обязательные поля формы теперь имеют обязательный атрибут HTML.Установите атрибут Form.use_required_attribute в False, чтобы отключить его.Вы также можете добавить атрибут novalidate, если вы не хотите проверять браузер.Чтобы отключить обязательный атрибут в пользовательских виджетах, переопределите метод Widget.use_required_attribute ().

Как говорят документы, вы можете переопределить это, добавив атрибут «novalidate» в форму HTML.Однако я обнаружил, что если вы позволите Django добавить атрибут 'required' ко всем тегам HTML-форм, а затем добавите дополнительную проверку пользовательских форм, вы можете добавить дополнительный уровень безопасности к своим формам.Обязательный атрибут гарантирует, что пользователь вводит что-то в каждое обязательное поле.Но если то, что они вводят, является недействительным, ваша форма может предоставить дополнительную проверку, которая будет отображаться в ответе.Конечно, вы можете реализовать полную проверку на стороне клиента, используя JavaScript и / или Ajax, или использовать пакет типа Django-parsley , чтобы вообще отказаться от проверки на стороне сервера.Это был интересный опыт обучения.

...