Как использовать значения формы из несвязанной формы - PullRequest
7 голосов
/ 16 сентября 2008

У меня есть веб-отчет, который использует форму Django (новые формы) для полей, которые управляют запросом, используемым для создания отчета (дата начала, дата окончания, ...). У меня проблема в том, что страница должна работать с использованием начальных значений формы (без привязки), но я не могу получить доступ к полю 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'])

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

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

Ответы [ 3 ]

4 голосов
/ 16 сентября 2008

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

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'))
2 голосов
/ 17 сентября 2008

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

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

0 голосов
/ 16 сентября 2008

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

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} )
...

См. официальную документацию API форм , где они демонстрируют это.

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

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'])

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

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