Поле RegexField
Поле RegexField применяется в формах Django для валидации строковых значений на соответствие регулярному выражению. Оно наследуется от CharField и добавляет обязательный параметр regex, в который передается скомпилированное регулярное выражение или строка с шаблоном. При инициализации поля можно указать дополнительный параметр max_length, ограничивающий максимальную длину строки. Также доступны параметры min_length, strip и стандартные аргументы для всех полей форм, такие как label, initial, required и error_messages.
Синтаксис
from 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
Создадим форму регистрации пользователя, в которой поле имени пользователя должно содержать только латинские буквы, цифры и символ подчеркивания:
from 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 в представлении:
from 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
})
Пример . Использование в шаблоне
Выведем форму в шаблоне с отображением ошибок валидации:
<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:
from 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)
Результат выполнения кода:
{'name': 'Иван Петров', 'phone': '+7 912 345-67-89'}
Пример . С динамической валидацией
Можно использовать RegexField с параметром strip для удаления пробелов перед валидацией:
from 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)
Результат выполнения кода:
{'promo_code': 'ABC123'}
Смотрите также
-
поле
CharField,
которое является базовым для строковых полей -
поле
EmailField,
которое проверяет корректность электронной почты -
поле
SlugField,
которое валидирует строки для использования в URL -
валидатор
RegexValidator,
который можно использовать для валидации отдельных полей моделей