JavaRush /Курсы /Модуль 3: Django /Валидация форм: встроенные валидаторы

Валидация форм: встроенные валидаторы

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

В этой лекции мы поговорим о том, как защитить ваши приложения от всякого рода "вредоносных данных". Встречайте валидацию!

Понятие валидации данных

Валидация данных — это тот самый могучий щит вашего приложения, который защищает его от некорректных или вредоносных данных. Валидация проверяет, что данные соответствуют ожидаемому формату и требованиям. Это позволяет не только избежать ошибок, но и защитить вашу базу данных от странных (и порой даже смешных) инъекций вроде '); DROP TABLE users; --.

Вот пример. Допустим, вы сделали поле для ввода электронной почты, а пользователь ввёл "ялюблюпитон". Очевидно, это не электронная почта. Чтобы данные были корректными, нам нужно убедиться, что пользователь ввёл значение в формате something@example.com. Это и называется валидацией.

Где применяется валидация в Django? Django Forms интегрируют валидацию прямо в свои поля. Это означает, что вам не придётся вручную проверять каждое поле — достаточно использовать встроенные валидаторы и расслабиться.

Когда вы вызываете метод .is_valid() на форме, Django автоматически запускает валидацию для всех полей.

Встроенные валидаторы Django

Django предлагает целый арсенал встроенных валидаторов. Словно у вас есть коробка инструментов на все случаи жизни: даже если не все сразу вам понадобятся, знать об их существовании крайне полезно.

Вот основные встроенные валидаторы, которые могут вам пригодиться:

  • EmailValidator: чтобы ваше поле действительно содержало корректный адрес электронной почты.
  • URLValidator: для проверки корректности URL.
  • MinLengthValidator и MaxLengthValidator: для ограничения длины строк.
  • RegexValidator: для проверки данных с помощью регулярных выражений.

Использование встроенных валидаторов

Давайте создадим простую форму регистрации, используя EmailValidator и MaxLengthValidator. Эта форма будет проверять, что введен корректный адрес электронной почты и имя пользователя не превышает 30 символов.

from django import forms
from django.core.validators import EmailValidator, MaxLengthValidator

class RegistrationForm(forms.Form):
    username = forms.CharField(
        max_length=30,
        validators=[MaxLengthValidator(30)],
        label="Имя пользователя"
    )
    email = forms.EmailField(
        validators=[EmailValidator(message="Введите корректный email.")],
        label="Электронная почта"
    )
    password = forms.CharField(
        widget=forms.PasswordInput,
        label="Пароль"
    )

Встроенные валидаторы в действии

Попробуем интегрировать эту форму в простое представление и убедимся, что валидация работает, как и ожидалось. Пусть будет простое представление, обрабатывающее GET и POST запросы.

from django.shortcuts import render
from django.http import HttpResponse
from .forms import RegistrationForm

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            # Здесь будет код для обработки данных формы
            return HttpResponse("Регистрация прошла успешно!")
        else:
            return render(request, 'register.html', {'form': form})
    else:
        form = RegistrationForm()
    return render(request, 'register.html', {'form': form})

Шаблон register.html должен отображать форму и ошибки, если таковые имеются:

<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Зарегистрироваться</button>
</form>

{% if form.errors %}
  <ul>
  {% for field in form %}
    {% for error in field.errors %}
      <li>{{ error }}</li>
    {% endfor %}
  {% endfor %}
  </ul>
{% endif %}

Попробуйте ввести некорректный email или слишком длинное имя пользователя, и вы увидите, как валидаторы не дадут данным пройти дальше.

Обработка ошибок валидации

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

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

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

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

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

Если вам не нравятся стандартные сообщения о том, что "эта форма недопустима", вы можете изменить их с помощью атрибута error_messages в описании полей формы.

username = forms.CharField(
    max_length=30,
    validators=[MaxLengthValidator(30)],
    label="Имя пользователя",
    error_messages={
        'max_length': 'Имя пользователя не должно превышать 30 символов.'
    }
)

Теперь, если пользователь введет слишком длинное имя пользователя, он увидит ваше кастомное сообщение, а не стандартную фразу.

Итоги

Вот и все на сегодня! Теперь у вас есть мощный инструмент для проверки данных в ваших Django приложениях. Валидация данных — это важный этап разработки, и ее правильная реализация поможет вам избежать множества проблем в будущем.

Для более глубокого изучения валидации в Django, рекомендуем ознакомиться с официальной документацией Django.

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