Поле ComboField

Поле ComboField в Django является подклассом Field и предназначено для создания составных полей формы, которые применяют несколько валидаторов и преобразований последовательно. Основное предназначение - комбинировать разные проверки для одного поля, например, проверка на максимальную длину и соответствие регулярному выражению одновременно. Поле принимает два основных аргумента: fields - список экземпляров полей, чьи валидаторы будут применены, и default_validators - дополнительные валидаторы. Данные проходят через каждый компонент поля последовательно, и если какой-либо из этапов не проходит, валидация считается неудачной.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  field_name = forms.ComboField(
    fields=[field_class1, field_class2, ...],
    **kwargs
  )

Пример

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

pythonfrom django import forms

class ProductForm(forms.Form):
  product_code = forms.ComboField(
    fields=[
      forms.CharField(max_length=5),
      forms.RegexField(regex=r'^[A-Z0-9]+$')
    ],
    label="Product Code",
    help_text="Must be 5 characters of letters and numbers"
  )

Пример

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

pythonfrom django import forms

class UserForm(forms.Form):
  username = forms.ComboField(
    fields=[
      forms.CharField(max_length=20),
      forms.RegexField(regex=r'^[a-zA-Z]+$')
    ],
    required=True,
    label="Username",
    initial="guest"
  )

Результат выполнения кода при отправке формы с корректным значением:

python# При валидных данных
form = UserForm({"username": "JohnDoe"})
if form.is_valid():
  print("Valid username:", form.cleaned_data["username"])
else:
  print("Errors:", form.errors)

"Valid username: JohnDoe"

Если данные не проходят проверку, например, ввод содержит цифры:

pythonform = UserForm({"username": "John123"})
if form.is_valid():
  print("Valid")
else:
  print("Errors:", form.errors)

"Errors: {'username': ['Enter a valid value.']}"

Пример

Используем поле ComboField для проверки электронной почты, которая должна быть не длиннее 50 символов и соответствовать формату email:

pythonfrom django import forms
from django.core.validators import EmailValidator

class ContactForm(forms.Form):
  email = forms.ComboField(
    fields=[
      forms.CharField(max_length=50),
      forms.EmailField()
    ],
    label="Email Address",
    required=True
  )

Теперь создадим экземпляр формы и проверим её работу:

pythonform = ContactForm({"email": "test@example.com"})
if form.is_valid():
  print("Email is valid:", form.cleaned_data["email"])
else:
  print("Errors:", form.errors)

"Email is valid: test@example.com"

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

  • поле CharField,
    которое используется для ввода строковых данных
  • поле RegexField,
    которое проверяет соответствие регулярному выражению
  • поле MultiValueField,
    которое объединяет несколько полей в одно составное значение
  • класс Form,
    который является базовым классом для всех форм