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 застосунках, і при цьому вони будуть набагато надійнішими та зручнішими.

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