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.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ