Проверка двух полей
Часть раздела Формы путешествия по Django на Coddy. Урок 11 из 20.
Зимняя книжная ярмарка длится три дня, и дата окончания не должна предшествовать дате начала. Метод clean_<field> проверяет одно поле, поэтому правило для нескольких полей размещают в clean(), который запускается после собственных проверок каждого поля. Форма бронирования, в которой группа численностью более 6 человек должна указать номер телефона:
def clean(self):
cleaned_data = super().clean()
guests = cleaned_data.get("guests")
phone = cleaned_data.get("phone")
if guests and guests > 6 and not phone:
self.add_error("phone", "Groups over 6 need a phone number.")
return cleaned_dataПоле, проверку которого не удалось пройти, отсутствует в cleaned_data, а пустая необязательная дата имеет значение None, поэтому считывайте значения с помощью .get() и сравнивайте их, только если присутствуют оба.
self.add_error() добавляет сообщение под одним полем. Вызов исключения forms.ValidationError в clean() создает ошибку всей формы, которую не отображает ни одно поле: для этого служит {{ form.non_field_errors }}.
Задание
Средне- Добавьте
end_dateвEventFormпослеdate: дату, которую можно оставить пустой. - Запретите указывать дату окончания раньше даты начала с помощью
The event cannot end before it starts.— ошибки для всей формы. - Сохраняйте
end_dateвnew_event. - Показывайте ошибки всей формы над полями.
Нажмите Run и попробуйте указать дату окончания раньше даты начала.
Попробуйте сами
import datetime
from django import forms
class EventForm(forms.Form):
title = forms.CharField(max_length=100)
date = forms.DateField()
place = forms.CharField(max_length=100)
description = forms.CharField(widget=forms.Textarea, required=False)
capacity = forms.IntegerField(min_value=1)
def clean_date(self):
date = self.cleaned_data["date"]
if date < datetime.date.today():
raise forms.ValidationError("The date cannot be in the past.")
return date
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Формы
2Формы Django
Форма DjangoСоздание формыПотренируйтесь самостоятельно: Песочница Django