2008-09-16 4 views
7

У меня есть веб-отчет, который использует форму 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']) 

, то есть не существует общий интерфейс для получения значений формы в период между связанной формой и несвязанным другом.

Кто-нибудь видит более чистый способ сделать это?

ответ

4

Если добавить этот метод в ваш класс формы:

def get_cleaned_or_initial(self, fieldname): 
     if hasattr(self, 'cleaned_data'): 
      return self.cleaned_data.get(fieldname) 
     else: 
      return self[fieldname].field.initial 

вы могли бы затем повторно написать свой код, как:

if request.method == 'GET': 
    form = MyForm() 
else: 
    form = MyForm(request.method.POST) 
    form.is_valid() 

do_query(form.get_cleaned_or_initial('start_date'), form.get_cleaned_or_initial('end_date')) 
0

Вы можете передать словарь начальных значений в форму:

if request.method == "GET": 
    # calculate my_start_date and my_end_date here... 
    form = MyForm({ 'start_date': my_start_date, 'end_date': my_end_date}) 
... 

Смотрите official forms API documentation, где они демонстрируют это.

редактировать: на основе ответов от других пользователей, может быть, это чистое решение:

if request.method == "GET": 
    form = MyForm() 
    form['start_date'] = form['start_date'].field.initial 
    form['end_date'] = 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']) 

Я не пробовал это, хотя; может кто-то подтвердить, что это работает? Я думаю, что это лучше, чем создание нового метода, потому что этот подход не требует другого кода (возможно, не написанного вами), чтобы узнать о вашем новом «волшебном» аксессуре.

+0

Да, но тогда значения по умолчанию не определяются формой (например, с начальным = значением в объявлениях полей). Если вы используете форму в нескольких местах, вам придется повторить свои значения по умолчанию. – davidavr 2008-09-16 19:18:24

1

несвязанный означает, что нет никаких данных, связанных с формой (либо начальный, либо предоставленный позже), поэтому проверка может завершиться неудачей. Как упоминалось в других ответах (и в вашем собственном заключении), вы должны указать начальные значения и проверить как связанные данные, так и начальные значения.

Вариант использования для форм - это обработка формы и валидация, поэтому перед доступом к cleaned_data вы должны иметь некоторые данные для проверки.

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