Проверка формы Django с помощью встроенных наборов форм - PullRequest
2 голосов
/ 18 июня 2011

У меня есть основная форма и три встроенных форсета на одной HTML-странице с целью создания оценок для клиентов.Первичный ключ «главной» формы используется в качестве внешнего ключа для всех трех встроенных наборов форм.Я могу создавать новые оценки, сохранять их, изменять данные и т.д. без проблем.Тем не менее, он работает только при наличии всех необходимых данных и является «действительным».

Как мне сделать так, чтобы страница HTML снова отображалась со всеми введенными данными, но с ошибками, отображаемыми в соответствующих местах?

Чтобы объяснить мою ситуацию более подробно, обычный метод для одной простой формы выглядит примерно так (это не в моей голове, так что, надеюсь, у меня нет ошибок кода):

if request.method=='POST':
    myform = Model_Form(request.POST)
    if myform.is_valid():
        myform.save()
        ...
        return HttpResponseredirect(...)
else:
    myform = new form from model etc...
return render_to_respose(template.html, {'myform':myform}, context_instance=RequestContext(request))

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

Со встроенными наборами форм мы делаем что-то вроде этого (при условии, что myForm имеет PK, а myInline использует это PK через внешний ключ):

if request.method=='POST':
    myform = Model_Form(request.POST)
    if myform.is_valid():
        tmp = myform.save(commit=False)
        myInline = inlineFormset(request.POST, instance=tmp)
        if myInline.is_valid():
            myInline.save()
            myform.save()
            return HttpResponseRedirect(...)
else:
    myform = new form from model etc...
    myInline = new inline formset from model etc...
return render_to_respose(template.html, {'myform':myform, 'myInline':myInline}, context_instance=RequestContext(request))

То же самое с приведенным выше кодом, если у меня есть ошибка проверки в myForm, мы выпадаем из оператора if и снова отображаем форму, чтобы показать ошибки.Однако встроенная форма еще не была создана (строка myInline = inlineFormset(request.POST, instance=tmp)), потому что этот шаг происходит после проверки правильности myForm, и мы получаем ошибку myInline Referenced before assignment или любую другую.

Чтобы бороться с этим, я попытался переместить строки:

        tmp = myform.save(commit=False)
        myInline = inlineFormset(request.POST, instance=tmp)

перед проверкой, действительно ли myForm, чтобы я мог захватить данные POST для встроенной формы.Но я не могу этого сделать, потому что я не проверил, действительно ли myForm.

Цыпленок и яйцо.Тьфу!

Итак, как мне выполнить проверку и показать ошибки ввода для форм при повторном отображении введенного пользователем содержимого для встроенных наборов форм?

Извините за длинный постно я не знаю, как сократить вопрос.


РЕДАКТИРОВАТЬ:

Хорошо, я выяснил, как показать ошибки проверки для основной формы myForm и отобразить все поля myForm, а также набор форм myInlineполя.Это выглядит так:

if request.method=='POST':
    myform = Model_Form(request.POST)
    if myform.is_valid():
        tmp = myform.save(commit=False)
        myInline = inlineFormset(request.POST, instance=tmp)
        if myInline.is_valid():
            myInline.save()
            myform.save()
            return HttpResponseRedirect(...)
    myInline = inlineFormset(request.POST)
else:
    myform = new form from model etc...
    myInline = new inline formset from model etc...
return render_to_respose(template.html, {'myform':myform, 'myInline':myInline}, context_instance=RequestContext(request))

Я просто пробираюсь в новом назначении myInline, прежде чем выйти из основного оператора if.

Надеюсь, это поможет кому-то еще с этой же проблемой.

Ура!

1 Ответ

1 голос
/ 20 июня 2011

Хорошо. Я выяснил, как показать ошибки проверки для основной формы myForm и заново отобразить все поля myForm, а также поля формы набора myInline. Это выглядит так:

if request.method=='POST':
    myform = Model_Form(request.POST)
    if myform.is_valid():
        tmp = myform.save(commit=False)
        myInline = inlineFormset(request.POST, instance=tmp)
        if myInline.is_valid():
            myInline.save()
            myform.save()
            return HttpResponseRedirect(...)
    myInline = inlineFormset(request.POST)
else:
    myform = new form from model etc...
    myInline = new inline formset from model etc...
return render_to_respose(template.html, {'myform':myform, 'myInline':myInline}, context_instance=RequestContext(request))

Я просто крадусь в новом назначении myInline, прежде чем выйти из основного оператора if.

Надеюсь, это поможет кому-то еще с этой же проблемой.

Ура! * * 1013

...