Solución:
En lugar de tener múltiples <form ..>
etiquetas en html, use solo una <form>
etiquetar y agregar campos de todos los formularios debajo de él.
Ejemplo en plantilla
<form >
{{ form1.as_p }}
{{ form2.as_p }}
{{ form3.as_p }}
</form>
Entonces, cuando el usuario envíe el formulario, obtendrá todos los datos de los formularios a la vista, luego podrá hacer lo que está haciendo a la vista. Como
if request.method == 'POST':
form1 = Form1(request.POST)
form2 = Form2(request.POST)
print(request.POST)
if form1.is_valid() or form2.is_valid():
Es mejor usar form prefix
en esos casos.
Para que puedas hacer
if request.method == 'POST':
form1 = Form1( request.POST,prefix="form1")
form2 = Form2( request.POST,prefix="form2")
print(request.POST)
if form1.is_valid() or form2.is_valid():
else:
form1 = Form1(prefix="form1")
form2 = Form2(prefix="form2")
Extendiendo el @Rohan responder y agregar más control sobre los formularios.
Formularios no dependientes / Sin relación / Guardar cualquier formulario de varios formularios
Compruebe individualmente cada formulario para comprobar qué formularios no son válidos. Luego, guárdelos en contexto si contienen errores o rediríjalos.
if request.method == 'POST':
form1 = Form1( request.POST,prefix="form1")
form2 = Form2( request.POST,prefix="form2")
if form1.is_valid():
# save them
# context['form1_message'] = 'Form1 saved'
else:
#save them into context
context['form1']= form1
if form2.is_valid():
# save them
# context['form2_message'] = 'Form2 saved'
else:
#save them into context
context['form2']= form2
if form1.is_valid() and form2.is_valid():
#that's mean both form is valid and saved successfully
return redirect('page')
else:
return render('/page', context)
else:
form1 = Form1(prefix="form1")
form2 = Form2(prefix="form2")
Formas dependientes / Forma de modelo (1-1,1-m) / Forma de relación
Un formulario principal y un formulario secundario que depende del formulario principal. Si ambos formularios se guardan o verifican errores al mismo tiempo, usaremos este método.
if request.method == 'POST':
form1 = Form1( request.POST,prefix="form1")
form2 = Form2( request.POST,prefix="form2")
if not form1.is_valid():
#save them into context
context['form1']= form1
if not form2.is_valid():
#save them into context
context['form2']= form2
if form1.is_valid() and form2.is_valid():
#that's mean both form is valid and saved successfully
return redirect('page')
else:
return render('/page', context)
else:
form1 = Form1(prefix="form1")
form2 = Form2(prefix="form2")