Валидатор RegexValidator

Валидатор RegexValidator применяется к полям формы для проверки введенного значения на соответствие регулярному выражению. Он принимает регулярное выражение в качестве обязательного аргумента и может опционально принимать сообщение об ошибке и флаги для компиляции регулярного выражения. В случае несоответствия валидатор выбрасывает исключение ValidationError с указанным сообщением.

Синтаксис

pythonRegexValidator(regex, message=None, code=None, flags=0)

Параметры конструктора:

Пример

Давайте создадим форму с полем для ввода имени пользователя, которое должно содержать только буквы латиницы, цифры и символ подчеркивания:

pythonfrom 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 с использованием флага для игнорирования регистра (хотя в данном примере это не принципиально):

pythonimport 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:

pythonfrom 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

Пример

Проверим работу валидатора на форме с обработкой ошибок:

pythonfrom 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)

Результат выполнения кода:

python"Form is valid"
"['Code must be 2 uppercase letters and 4 digits (e.g., AB1234)']"

Смотрите также

  • валидатор EmailValidator,
    который проверяет корректность email-адреса
  • валидатор URLValidator,
    который проверяет корректность URL-адреса
  • валидатор DomainNameValidator,
    который проверяет корректность доменного имени
  • поле RegexField,
    которое использует RegexValidator для проверки вводимых данных