2013-06-02 7 views
2

У меня есть форма с двумя полей даты, как требуется:Джанго игнорирует форму поле, необходимое = 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().

Я что-то упустил?

ответ

2

Проверка уровня поля - выполнено до того, как вы доберетесь до clean. В чем-то не так, что ваше предположение о том, что clean не будет вызываться, если какая-либо из этих проверок поля не удалась. Он всегда называется: иначе как будут созданы какие-либо сообщения о проверке уровня формы?

Вам необходимо защитить себя от KeyError, используя, например, form.cleaned_data.get().

+0

Я все еще смущен. Мое предположение состоит в том, что required = True инициирует исключение ValidationError при вводе ничего в этом конкретном поле. Это исключение затем прекратит дальнейшее выполнение процесса проверки формы и сообщит об ошибке (через форму). Прежде чем Django получит выполнение метода clean() ... – Roger

+0

Но это часть «halt», которая неверна. 'clean' всегда вызывается, поскольку он имеет возможность поднять собственные сообщения проверки, которые могут не иметь ничего общего с любыми другими ошибками проверки: было бы странным предотвращать, скажем, ошибку« пароли не совпадают » просто потому, что вам не удалось заполнить полностью отдельное обязательное поле. –

+1

Итак, clean() вызывается, несмотря на то, что проверка поля (обязательно) вызвала исключение? Я не хочу разрывать волосы, но исключений не существует, чтобы блокировать нормальный поток программ, чтобы мы могли справляться с исключительными ситуациями? – Roger

Смежные вопросы