JavaRush /Курсы /Модуль 3: Django /Django Forms: Ошибки форм и их отображение в шаблонах

Django Forms: Ошибки форм и их отображение в шаблонах

Модуль 3: Django
12 уровень , 5 лекция
Открыта

Теперь у нас есть базовое понимание работы с формами, однако неизбежно возникает вопрос: что делать, если пользователь ввёл некорректные данные? Сегодня мы разберём систему обработки ошибок в Django Forms и научимся отображать их в шаблонах.

Работа с ошибками формы

Когда пользователь отправляет форму, а данные, которые он ввёл, не проходят валидацию, Django возвращает нам список ошибок. Эти ошибки включают как стандартные сообщения (например, "This field is required"), так и кастомные, которые мы можем сами настроить.

Как Django обрабатывает ошибки формы? Когда вы вызываете метод is_valid() на экземпляре формы, Django автоматически проверяет данные формы на основе валидаторов, указанных для каждого поля. Если данные не соответствуют требованиям, форма становится "невалидной", а ошибки сохраняются в словаре form.errors.

Пример:

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=50, required=True)
    email = forms.EmailField(required=True)
    message = forms.CharField(widget=forms.Textarea, required=True)

# В представлении
form = ContactForm(data={"name": "", "email": "notanemail", "message": ""})
if not form.is_valid():
    print(form.errors)

Вывод (чисто для ваших глаз, конечно, не для фронтенда):

{'name': ['This field is required.'],
 'email': ['Enter a valid email address.'],
 'message': ['This field is required.']}

Отображение ошибок в шаблонах

Ошибки формы можно показать пользователю через шаблон следующим образом:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    {% for field in form %}
        {% if field.errors %}
            <div class="error">
                {{ field.errors }}
            </div>
        {% endif %}
    {% endfor %}
    <input type="submit" value="Submit">
</form>

Такой подход позволяет обработать ошибки для каждого поля отдельно. Если вы хотите вывести одну "общую" ошибку для всей формы (например, при кастомной валидации), её можно добавить через метод add_error() внутри формы.

Кастомизация сообщений об ошибках

Django позволяет изменить стандартные сообщения об ошибках, чтобы сделать их более понятными для пользователя. Среди разработчиков ходит забавная привычка оставлять пользователям юмористические или саркастичные сообщения, но если вы работаете над серьёзным проектом, лучше избегать этого (поверьте, пользователи не оценят шутку уровня "Ты правда думал, что это сработает?" на странице регистрации).

Вы можете настроить сообщения об ошибках, добавляя атрибут error_messages для каждого поля формы:

class ContactForm(forms.Form):
    name = forms.CharField(
        max_length=50,
        required=True,
        error_messages={
            "required": "Имя обязательно для заполнения.",
            "max_length": "Имя не может быть длиннее 50 символов."
        }
    )
    email = forms.EmailField(
        required=True,
        error_messages={
            "required": "Укажите ваш адрес электронной почты.",
            "invalid": "Введите корректный адрес электронной почты."
        }
    )

Теперь, если пользователь, например, забудет ввести имя, он увидит сообщение "Имя обязательно для заполнения", а не стандартное "This field is required."

Работа с ошибками в шаблонах

Когда форма содержит ошибки, вы можете отобразить их пользователю. Для этого используйте словарь form.errors в шаблонах. Вот пример, как это сделать красиво:

Пример отображения всех ошибок

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}

    {% if form.errors %}
        <ul class="error-list">
            {% for field, errors in form.errors.items %}
                <li>
                    <strong>{{ form[field].label }}:</strong>
                    {% for error in errors %}
                        {{ error }}
                    {% endfor %}
                </li>
            {% endfor %}
        </ul>
    {% endif %}

    <input type="submit" value="Submit">
</form>

Пример кастомной стилизации

Если вы хотите стилизовать поля с ошибками (например, добавить красную рамку вокруг поля), можно использовать атрибут as_widget с параметром attrs для добавления классов:

class ContactForm(forms.Form):
    name = forms.CharField(
        max_length=50,
        required=True,
        widget=forms.TextInput(attrs={'class': 'form-control'})
    )
    email = forms.EmailField(
        required=True,
        widget=forms.TextInput(attrs={'class': 'form-control'})
    )

И в шаблоне:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    {% for field in form %}
        <div class="form-group">
            {{ field.label_tag }}
            {{ field }}
            {% if field.errors %}
                <div class="error-text">
                    {% for error in field.errors %}
                        {{ error }}
                    {% endfor %}
                </div>
            {% endif %}
        </div>
    {% endfor %}

    <button type="submit" class="btn btn-primary">Отправить</button>
</form>

Практика: кастомизация ошибок

Давайте создадим форму обратной связи и настроим её ошибки так, чтобы пользователь не скучал при их чтении. Шутки, конечно, будут под вашим контролем.

Модель Feedback

from django.db import models

class Feedback(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
    message = models.TextField()

Форма FeedbackForm

class FeedbackForm(forms.Form):
    name = forms.CharField(
        max_length=50,
        required=True,
        error_messages={
            "required": "Оу! Кажется, вы забыли указать своё имя.",
            "max_length": "Имя слишком длинное. Давайте короче!"
        }
    )
    email = forms.EmailField(
        required=True,
        error_messages={
            "required": "Эй, мы не можем связаться с вами без email!",
            "invalid": "Вы уверены, что это email? Проверьте ещё раз!"
        }
    )
    message = forms.CharField(
        widget=forms.Textarea,
        required=True,
        error_messages={
            "required": "Сообщение пустое. Расскажите нам, что вас беспокоит."
        }
    )

Представление

from django.shortcuts import render
from .forms import FeedbackForm

def feedback_view(request):
    if request.method == "POST":
        form = FeedbackForm(request.POST)
        if form.is_valid():
            # Сохранение данных или обработка, не рассматривается пока
            return render(request, "feedback_success.html")
    else:
        form = FeedbackForm()

    return render(request, "feedback_form.html", {"form": form})

Шаблон feedback_form.html

<form method="post">
    {% csrf_token %}
    {% for field in form %}
        <div>
            {{ field.label_tag }}: {{ field }}
            {% if field.errors %}
                <span class="error-text">
                    {% for error in field.errors %}
                        {{ error }}
                    {% endfor %}
                </span>
            {% endif %}
        </div>
    {% endfor %}
    <button type="submit">Отправить</button>
</form>

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

Теперь у вас в руках эффективный способ работы с ошибками форм и их отображения! В следующей лекции мы рассмотрим, как кастомизировать процесс валидации с использованием методов is_valid() и clean() и ещё глубже погрузимся в магию Django Forms.

1
Задача
Модуль 3: Django, 12 уровень, 5 лекция
Недоступна
Отображение ошибок формы
Отображение ошибок формы
1
Задача
Модуль 3: Django, 12 уровень, 5 лекция
Недоступна
Кастомизация сообщений об ошибках
Кастомизация сообщений об ошибках
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ