Валидатор RegexValidator
Валидатор RegexValidator применяется к полям формы для проверки введенного значения на соответствие регулярному выражению. Он принимает регулярное выражение в качестве обязательного аргумента и может опционально принимать сообщение об ошибке и флаги для компиляции регулярного выражения. В случае несоответствия валидатор выбрасывает исключение ValidationError с указанным сообщением.
Синтаксис
RegexValidator(regex, message=None, code=None, flags=0)
Параметры конструктора:
-
regex- обязательный параметр, строка с регулярным выражением или скомпилированный объект регулярного выражения; -
message- опциональное сообщение об ошибке, которое будет показано при несоответствии значения; -
code- опциональный код ошибки для идентификации типа ошибки валидации; -
flags- опциональные флаги для компиляции регулярного выражения, например,re.IGNORECASE.
Пример
Давайте создадим форму с полем для ввода имени пользователя, которое должно содержать только буквы латиницы, цифры и символ подчеркивания:
from django import forms
from django.core.validators import RegexValidator
class UserRegistrationForm(forms.Form):
username = forms.CharField(
label="Username",
max_length=20,
validators=[
RegexValidator(
regex=r'^[a-zA-Z0-9_]+$',
message="Username must contain only letters, digits and underscore",
code="invalid_username"
)
]
)
Пример
Рассмотрим валидацию номера телефона в формате +7 (XXX) XXX-XX-XX с использованием флага для игнорирования регистра (хотя в данном примере это не принципиально):
import re
from django import forms
from django.core.validators import RegexValidator
class ContactForm(forms.Form):
phone = forms.CharField(
label="Phone number",
validators=[
RegexValidator(
regex=r'^\+\d{1,3}\s\(\d{3}\)\s\d{3}-\d{2}-\d{2}$',
message="Enter phone in format: +7 (XXX) XXX-XX-XX",
flags=re.IGNORECASE
)
]
)
Пример
Используем встроенную функцию валидации в модели, применяя RegexValidator для проверки поля slug:
from django.db import models
from django.core.validators import RegexValidator
class Article(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(
max_length=50,
validators=[
RegexValidator(
regex=r'^[a-z0-9-]+$',
message="Slug must contain only lowercase letters, digits and hyphens",
code="invalid_slug"
)
]
)
def __str__(self):
return self.title
Пример
Проверим работу валидатора на форме с обработкой ошибок:
from django import forms
from django.core.validators import RegexValidator
class ProductForm(forms.Form):
article_code = forms.CharField(
label="Article code",
max_length=10,
validators=[
RegexValidator(
regex=r'^[A-Z]{2}\d{4}$',
message="Code must be 2 uppercase letters and 4 digits (e.g., AB1234)"
)
]
)
# Создаем экземпляр формы с валидными данными
form_valid = ProductForm({'article_code': 'AB1234'})
if form_valid.is_valid():
res = "Form is valid"
print(res)
# Создаем экземпляр формы с невалидными данными
form_invalid = ProductForm({'article_code': 'ab1234'})
if not form_invalid.is_valid():
res = form_invalid.errors['article_code']
print(res)
Результат выполнения кода:
"Form is valid"
"['Code must be 2 uppercase letters and 4 digits (e.g., AB1234)']"
Смотрите также
-
валидатор
EmailValidator,
который проверяет корректность email-адреса -
валидатор
URLValidator,
который проверяет корректность URL-адреса -
валидатор
DomainNameValidator,
который проверяет корректность доменного имени -
поле
RegexField,
которое используетRegexValidatorдля проверки вводимых данных