Валідатори у 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, важливо пам’ятати:
- Логіка валідації не повинна дублюватися. Якщо ти вже додав валідатор у модель, не потрібно його повторювати у формі. Валідація буде виконуватися автоматично.
- Зручність для користувача. Переконайся, що повідомлення про помилки зрозумілі. Користувач має одразу зрозуміти, що він зробив не так.
- Не зловживай. Надто суворі правила можуть дратувати користувачів. Залиш свободу там, де це можливо.
Завдяки валідаторам ти зможеш значно спростити перевірку даних у своїх Django застосунках, і при цьому вони будуть набагато надійнішими та зручнішими.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ