У меня есть основная форма и три встроенных форсета на одной 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
.
Надеюсь, это поможет кому-то еще с этой же проблемой.
Ура!