Да. Ответ Лин Тролля включает в себя два важных момента.
Вероятно, вы найдете это проще всего, используя функциональные представления (Generi c FormView
и производные классы действительно не работают с> 1 формой). О. Я также не нахожу каноническую форму FBV полезной, особенно с двумя формами.
Вот представление в двух формах, которое я написал ранее. Код был преобразован в то, что я считаю лучшим шаблоном, для проверки обеих форм и повторного отображения, если что-то не так в верхней части, а затем вы просто выполняете фактическую работу по созданию и сохранению объектов внизу.
def receive_uncoated( request): #Function based view
# let's put form instantiation in one place not two, and reverse the usual test. This
# makes for a much nicer layout with actions not sandwiched by "boilerplate"
# note any([ ]) forces invocation of both .is_valid() methods
# so errors in second form get shown even in presence of errors in first
args = [request.POST, ] if request.method == "POST" else []
batchform = CreateUncWaferBatchForm( *args )
po_form = CreateUncWaferPOForm( *args, prefix='po')
if request.method != "POST" or any(
[ not batchform.is_valid(), not po_form.is_valid() ]):
return render(request, 'wafers/receive_uncoated.html', # can get this out of the way at the top
{'batchform': batchform,
'po_form': po_form,
})
#POST, everything is valid, do the work here
# create and save some objects based on the validated forms ...
return redirect( 'wafers:ok' )