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

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

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

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

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

Пример: проверка длины строки

from django.core.exceptions import ValidationError

def validate_length(value):
    if len(value) < 5:
        raise ValidationError('Длина значения должна быть не менее 5 символов.')

Этот валидатор проверяет, чтобы введённое значение имело длину не меньше пяти символов. Если значение не соответствует, вызывается исключение ValidationError.

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

Django предоставляет готовые валидаторы на любой случай жизни. Чтобы использовать их, нужно указать валидатор в модели или в самом ModelForm. Давайте разберем, как это выглядит.

Пример: использование валидаторов в модели

Когда создаётся модель, валидаторы можно добавлять к её полям с помощью аргумента validators. Эти валидаторы будут автоматически применяться при сохранении данных через ModelForm.

from django.db import models
from django.core.validators import MaxLengthValidator, MinValueValidator

class Product(models.Model):
    name = models.CharField(max_length=100, validators=[MaxLengthValidator(50)])
    price = models.DecimalField(max_digits=10, decimal_places=2, validators=[MinValueValidator(0)])
  • MaxLengthValidator(50) — ограничивает длину имени продукта до 50 символов.
  • MinValueValidator(0) — проверяет, чтобы цена была больше или равна 0.

Пример: использование валидаторов в ModelForm

Валидацию можно настроить в самой форме, например:

from django import forms
from .models import Product
from django.core.validators import MaxValueValidator

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'price']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['price'].validators.append(MaxValueValidator(10000))

Здесь мы добавили валидатор MaxValueValidator к полю price, ограничив максимальную цену продукта значением 10 000.

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

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

Валидатор Описание
MaxLengthValidator() Проверяет, чтобы длина строки не превышала указанное значение
MinLengthValidator() Проверяет, чтобы длина строки была не меньше указанного значения
MaxValueValidator() Проверяет, чтобы число не превышало указанное значение
MinValueValidator() Проверяет, чтобы число было не меньше указанного значения
EmailValidator() Проверяет, что введённое значение — корректный email
RegexValidator() Проверяет, что значение соответствует указанному регулярному выражению
URLValidator() Проверяет, что значение является корректным URL
validate_slug Проверяет, что значение состоит только из букв, цифр, дефисов и нижних подчёркиваний
validate_email Проверяет правильность email
validate_ipv4_address Проверяет, что значение является корректным IPv4 адресом

Примеры и практика

Проверка длины строки

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

from django.core.validators import MinLengthValidator

class Review(models.Model):
    comment = models.TextField(validators=[MinLengthValidator(10)])

Если пользователь введёт текст короче 10 символов, он получит сообщение об ошибке: "Ensure this value has at least 10 characters (it has N)."

Проверка формата email

Допустим, вы хотите убедиться, что email пользователя корректен. Для этого можно использовать EmailValidator.

from django.core.validators import EmailValidator

class ContactForm(forms.Form):
    email = forms.CharField(validators=[EmailValidator()])

Если пользователь введёт неверный email (например, hello@world), он получит ошибку: "Enter a valid email address."

Проверка с помощью регулярных выражений

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

from django.core.validators import RegexValidator

class UserProfile(models.Model):
    name = models.CharField(max_length=100, validators=[
        RegexValidator(
            regex=r'^[A-Z][a-z]*$',
            message='Имя должно начинаться с заглавной буквы и содержать только буквы.'
        )
    ])

В данном случае валидатор проверяет строку по регулярному выражению.

Как добавить собственные валидаторы

Django позволяет не только использовать встроенные валидаторы, но и создавать свои собственные. Если встроенных средств не хватает, всегда можно написать свою функцию или класс для проверки данных.

Допустим, у нас есть поле с номером телефона, и мы хотим гарантировать, что номер начинается с кода страны "+7".

from django.core.exceptions import ValidationError

def validate_phone_number(value):
    if not value.startswith('+7'):
        raise ValidationError('Номер телефона должен начинаться с "+7".')

class Contact(models.Model):
    phone = models.CharField(max_length=20, validators=[validate_phone_number])

Если пользователь введёт номер, не соответствующий условию, он получит сообщение об ошибке.

Советы и подводные камни при использовании валидаторов

Когда вы работаете с валидаторами в ModelForm, важно помнить:

  1. Логика валидации не должна дублироваться. Если вы уже добавили валидатор в модель, не нужно его повторять в форме. Валидация будет выполняться автоматически.
  2. Удобство для пользователя. Убедитесь, что сообщения об ошибках понятны. Пользователь должен сразу понять, что он сделал не так.
  3. Не злоупотребляйте. Слишком строгие правила могут раздражать пользователей. Оставьте свободу там, где это возможно.

С помощью валидаторов вы сможете значительно упростить проверку данных в ваших Django приложениях, и при этом они будут куда надёжнее и удобнее.

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