РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
383 of 818 menu

Класс 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-параграфов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить