Класс Form

Класс Form является базовым для создания форм в Django. Он позволяет определять поля формы, валидировать данные, отображать форму в HTML-шаблонах и обрабатывать отправленные пользователем данные. Каждое поле формы связано с определенным типом данных и может иметь свои валидаторы. Форма может быть привязана к данным (bound) или не привязана (unbound). Привязанная форма содержит отправленные пользователем данные и может проходить валидацию.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  field_name = forms.FieldType(**options)

Пример

Давайте создадим простую форму регистрации с полями для имени, email и возраста:

pythonfrom django import forms

class RegistrationForm(forms.Form):
  name = forms.CharField(label="Your Name", max_length=100)
  email = forms.EmailField(label="Email Address")
  age = forms.IntegerField(label="Age", min_value=1, max_value=120)

Пример

Давайте обработаем отправленные данные с помощью формы. Сначала создадим привязанную форму, а затем проверим ее валидность:

pythonfrom django import forms

class RegistrationForm(forms.Form):
  name = forms.CharField(max_length=100)
  email = forms.EmailField()
  age = forms.IntegerField(min_value=1, max_value=120)

# Data from request.POST
data = {
  "name": "John Doe",
  "email": "john@example.com",
  "age": "25",
}

form = RegistrationForm(data)

if form.is_valid():
  print("Form is valid")
  print(form.cleaned_data)
else:
  print("Form is invalid")
  print(form.errors)

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

python"Form is valid"
{"name": "John Doe", "email": "john@example.com", "age": 25}

Пример

Давайте рассмотрим случай, когда данные не проходят валидацию. Например, возраст меньше минимального значения:

pythonfrom django import forms

class RegistrationForm(forms.Form):
  name = forms.CharField(max_length=100)
  email = forms.EmailField()
  age = forms.IntegerField(min_value=1, max_value=120)

invalid_data = {
  "name": "Jane Doe",
  "email": "jane@example.com",
  "age": "0",
}

form = RegistrationForm(invalid_data)

if form.is_valid():
  print("Form is valid")
  print(form.cleaned_data)
else:
  print("Form is invalid")
  print(form.errors)

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

python"Form is invalid"
{"age": ["Ensure this value is greater than or equal to 1."]}

Пример

Форма может быть использована для отображения в шаблоне. Рассмотрим, как создать не привязанную форму и отрендерить ее поля:

pythonfrom django import forms

class ContactForm(forms.Form):
  subject = forms.CharField(max_length=100)
  message = forms.CharField(widget=forms.Textarea)
  sender = forms.EmailField()
  cc_myself = forms.BooleanField(required=False)

# Unbound form
form = ContactForm()

# Render form as HTML
print(form.as_p())
print(form.as_table())
print(form.as_ul())

Результат выполнения кода (частичный вывод):

python"<p><label for="id_subject">Subject:</label> <input type="text" name="subject" maxlength="100" required id="id_subject"></p>
<p><label for="id_message">Message:</label> <textarea name="message" cols="40" rows="10" required id="id_message"></textarea></p>
<p><label for="id_sender">Sender:</label> <input type="email" name="sender" required id="id_sender"></p>
<p><label for="id_cc_myself">Cc myself:</label> <input type="checkbox" name="cc_myself" id="id_cc_myself"></p>"

Пример

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

pythonfrom django import forms
from django.core.exceptions import ValidationError

class RegistrationForm(forms.Form):
  username = forms.CharField(max_length=50)
  password = forms.CharField(widget=forms.PasswordInput)
  confirm_password = forms.CharField(widget=forms.PasswordInput)

  def clean(self):
    cleaned_data = super().clean()
    password = cleaned_data.get("password")
    confirm_password = cleaned_data.get("confirm_password")

    if password and confirm_password and password != confirm_password:
      raise ValidationError("Passwords do not match")

    return cleaned_data

data = {
  "username": "john_doe",
  "password": "secret123",
  "confirm_password": "secret456",
}

form = RegistrationForm(data)
if form.is_valid():
  print("Form is valid")
  print(form.cleaned_data)
else:
  print("Form is invalid")
  print(form.errors)

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

python"Form is invalid"
{"__all__": ["Passwords do not match"]}

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

  • метод is_valid,
    который выполняет валидацию формы и возвращает True или False
  • атрибут cleaned_data,
    который содержит словарь с валидными данными формы
  • атрибут errors,
    который содержит словарь с ошибками валидации
  • метод as_p,
    который возвращает форму в виде HTML-параграфов