У меня есть форма с двумя полей даты, как требуется:Джанго игнорирует форму поле, необходимое = True
arrival_date = forms.DateField(
required = True,
widget = DateInput(attrs={
"class": "input-small"
}),
)
departure_date = forms.DateField(
required = True,
widget = DateInput(attrs = {
"class": "input-small"
})
)
Поскольку обе даты связаны некоторые сложные проверки в рамках более широком контексте, форма также имеет clean()
метод, который выполняет некоторые дополнительные проверки на даты:
def clean(self):
cleaned_data = super(NewBookingForm3, self).clean()
arrival_date = cleaned_data["arrival_date"]
departure_date = cleaned_data["departure_date"]
property_object = self.wizard.object.property
try:
validate_booked_dates(arrival_date, departure_date, property_object)
except forms.ValidationError:
del cleaned_data["arrival_date"]
del cleaned_data["departure_date"]
raise
return cleaned_data
Сейчас проблема заключается в том, что по-видимому, метод clean()
делает Django игнорировать required=True
на полевом уровне, потому что, когда я отправить форму без ввода ничего о clean()
срабатывает, но падает с KeyError
, поскольку словарь cleaned_data
не содержит этого ключа (что понятно, поскольку я ничего не вводил).
Я ожидаю, что проверка уровня поля required=True
быть выполнена ДО clean()
, который бы тогда флаг, что оба поля должны запись какого-то и сообщить, что ошибка обратно без запуска clean()
.
Я что-то упустил?
Я все еще смущен. Мое предположение состоит в том, что required = True инициирует исключение ValidationError при вводе ничего в этом конкретном поле. Это исключение затем прекратит дальнейшее выполнение процесса проверки формы и сообщит об ошибке (через форму). Прежде чем Django получит выполнение метода clean() ... – Roger
Но это часть «halt», которая неверна. 'clean' всегда вызывается, поскольку он имеет возможность поднять собственные сообщения проверки, которые могут не иметь ничего общего с любыми другими ошибками проверки: было бы странным предотвращать, скажем, ошибку« пароли не совпадают » просто потому, что вам не удалось заполнить полностью отдельное обязательное поле. –
Итак, clean() вызывается, несмотря на то, что проверка поля (обязательно) вызвала исключение? Я не хочу разрывать волосы, но исключений не существует, чтобы блокировать нормальный поток программ, чтобы мы могли справляться с исключительными ситуациями? – Roger