У меня есть веб-отчет, который использует форму Django (новые формы) для полей, которые управляют запросом, используемым для генерации отчета (дата начала, дата окончания, ...). Проблема, с которой я сталкиваюсь, заключается в том, что страница должна работать с использованием начальных значений формы (unbound), но я не могу получить доступ к полю cleaned_data, если я не позвоню is_valid(). Но is_valid() всегда терпит неудачу при несвязанных формах.Как использовать значения формы из несвязанной формы
Похоже, что формы Django были разработаны с использованием случая редактирования данных, так что несвязанная форма не очень полезна ни для чего, кроме отображения HTML.
Например, если у меня есть:
if request.method == 'GET':
form = MyForm()
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
is_valid() потерпит неудачу, если это GET (так как это несвязанный), и если я делаю:
if request.method == 'GET':
form = MyForm()
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
Первый вызов do_query запускает исключения из form.cleaned_data, который не является допустимым полем, потому что is_valid() не был вызван. Похоже, что я должен сделать что-то вроде:
if request.method == 'GET':
form = MyForm()
do_query(form['start_date'].field.initial, form['end_date'].field.initial)
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
, то есть не существует общий интерфейс для получения значений формы в период между связанной формой и несвязанным другом.
Кто-нибудь видит более чистый способ сделать это?
Да, но тогда значения по умолчанию не определяются формой (например, с начальным = значением в объявлениях полей). Если вы используете форму в нескольких местах, вам придется повторить свои значения по умолчанию. – davidavr 2008-09-16 19:18:24