Класс Form
Класс Form является базовым для создания форм в Django. Он позволяет определять поля формы, валидировать данные, отображать форму в HTML-шаблонах и обрабатывать отправленные пользователем данные. Каждое поле формы связано с определенным типом данных и может иметь свои валидаторы. Форма может быть привязана к данным (bound) или не привязана (unbound). Привязанная форма содержит отправленные пользователем данные и может проходить валидацию.
Синтаксис
from django import forms
class MyForm(forms.Form):
field_name = forms.FieldType(**options)
Пример
Давайте создадим простую форму регистрации с полями для имени, email и возраста:
from 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)
Пример
Давайте обработаем отправленные данные с помощью формы. Сначала создадим привязанную форму, а затем проверим ее валидность:
from 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)
Результат выполнения кода:
"Form is valid"
{"name": "John Doe", "email": "john@example.com", "age": 25}
Пример
Давайте рассмотрим случай, когда данные не проходят валидацию. Например, возраст меньше минимального значения:
from 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)
Результат выполнения кода:
"Form is invalid"
{"age": ["Ensure this value is greater than or equal to 1."]}
Пример
Форма может быть использована для отображения в шаблоне. Рассмотрим, как создать не привязанную форму и отрендерить ее поля:
from 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())
Результат выполнения кода (частичный вывод):
"<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 для кастомной валидации, которая проверяет взаимосвязь между полями:
from 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)
Результат выполнения кода:
"Form is invalid"
{"__all__": ["Passwords do not match"]}
Смотрите также
-
метод
is_valid,
который выполняет валидацию формы и возвращает True или False -
атрибут
cleaned_data,
который содержит словарь с валидными данными формы -
атрибут
errors,
который содержит словарь с ошибками валидации -
метод
as_p,
который возвращает форму в виде HTML-параграфов