Поле RegexField

Поле RegexField применяется в формах Django для валидации строковых значений на соответствие регулярному выражению. Оно наследуется от CharField и добавляет обязательный параметр regex, в который передается скомпилированное регулярное выражение или строка с шаблоном. При инициализации поля можно указать дополнительный параметр max_length, ограничивающий максимальную длину строки. Также доступны параметры min_length, strip и стандартные аргументы для всех полей форм, такие как label, initial, required и error_messages.

Синтаксис

pythonfrom django import forms
import re

regex_field = forms.RegexField(
  regex=re.compile(r'^[A-Z]{3}-\d{4}$'),
  max_length=8,
  min_length=8,
  label='Код продукта',
  required=True,
  error_messages={
    'invalid': 'Введите код в формате XXX-1234',
  }
)

Пример . Создание формы с RegexField

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

pythonfrom django import forms
import re

class RegistrationForm(forms.Form):
  username = forms.RegexField(
    regex=re.compile(r'^[a-zA-Z0-9_]{4,20}$'),
    label='Имя пользователя',
    max_length=20,
    min_length=4,
    error_messages={
      'invalid': 'Имя может содержать только буквы, цифры и подчеркивание',
      'min_length': 'Имя должно быть не короче 4 символов',
    }
  )
  email = forms.EmailField(label='Email')
  password = forms.CharField(
    widget=forms.PasswordInput(),
    label='Пароль'
  )

Пример . Обработка формы в представлении

Рассмотрим, как обрабатывать форму с полем RegexField в представлении:

pythonfrom django.shortcuts import render
from .forms import RegistrationForm

def register(request):
  if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
      username = form.cleaned_data['username']
      # Дальнейшая обработка данных
      return render(request, 'success.html', {
        'username': username
      })
  else:
    form = RegistrationForm()
  
  return render(request, 'register.html', {
    'form': form
  })

Пример . Использование в шаблоне

Выведем форму в шаблоне с отображением ошибок валидации:

python<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Зарегистрироваться</button>
</form>

{% if form.username.errors %}
  <div class="errors">
    {% for error in form.username.errors %}
      <p>{{ error }}</p>
    {% endfor %}
  </div>
{% endif %}

Пример . Валидация телефонного номера

Поле RegexField удобно использовать для проверки формата телефонных номеров. Например, для российских номеров в формате +7 XXX XXX-XX-XX:

pythonfrom django import forms
import re

class ContactForm(forms.Form):
  name = forms.CharField(label='Имя', max_length=50)
  phone = forms.RegexField(
    regex=re.compile(r'^\+7\s\d{3}\s\d{3}-\d{2}-\d{2}$'),
    label='Телефон',
    max_length=18,
    error_messages={
      'invalid': 'Введите номер в формате +7 XXX XXX-XX-XX',
    }
  )
  
# Проверка валидности
form = ContactForm({
  'name': 'Иван Петров',
  'phone': '+7 912 345-67-89'
})
if form.is_valid():
  res = form.cleaned_data
  print(res)
else:
  print(form.errors)

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

python{'name': 'Иван Петров', 'phone': '+7 912 345-67-89'}

Пример . С динамической валидацией

Можно использовать RegexField с параметром strip для удаления пробелов перед валидацией:

pythonfrom django import forms
import re

class CodeForm(forms.Form):
  promo_code = forms.RegexField(
    regex=re.compile(r'^[A-Z0-9]{6}$'),
    label='Промокод',
    max_length=6,
    min_length=6,
    strip=True,
    error_messages={
      'invalid': 'Промокод должен состоять из 6 заглавных букв и цифр',
    }
  )
  
# Проверка с пробелами
form = CodeForm({
  'promo_code': ' ABC123 '
})
if form.is_valid():
  res = form.cleaned_data
  print(res)
else:
  print(form.errors)

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

python{'promo_code': 'ABC123'}

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

  • поле CharField,
    которое является базовым для строковых полей
  • поле EmailField,
    которое проверяет корректность электронной почты
  • поле SlugField,
    которое валидирует строки для использования в URL
  • валидатор RegexValidator,
    который можно использовать для валидации отдельных полей моделей