Comment traiter les deux formes dans une vue?
-
23-08-2019 - |
Question
J'ai deux formes complètement différentes dans un seul modèle. Comment les traiter en une seule vue? Comment puis-je distinguer des formes qui a été soumis? Comment puis-je utiliser le préfixe pour acomplish qui? Ou peut-être il vaut mieux écrire des vues séparées?
ce qui a trait
chriss
La solution
Personnellement, j'utiliser une vue à gérer POST de chaque formulaire.
Par contre, vous pouvez utiliser un élément d'entrée cachée qui indiquent quelle forme utilisée
<form action="/blog/" method="POST">
{{ blog_form.as_p }}
<input type="hidden" name="form-type" value"blog-form" /> <!-- set type -->
<input type="submit" value="Submit" />
</form>
...
<form action="/blog/" method="POST">
{{ micro_form.as_p }}
<input type="hidden" name="form-type" value"micro-form" /> <!-- set type -->
<input type="submit" value="Submit" />
</form>
En vue comme:
def blog(request):
if request.method == 'POST':
if request.POST['form-type'] == u"blog-form": # test the form type
form = BlogForm(request.POST)
...
else:
form = MicroForm(request.POST)
...
return render_to_response('blog.html', {
'blog_form': BlogForm(),
'micro_form': MicroForm(),
})
... mais encore une fois, je pense que d'une vue par la forme (même si la vue n'accepte que POSTs) est plus simple que d'essayer de faire ce qui précède.
Autres conseils
comme dit Ayaz, vous devez donner nom unique pour former le bouton soumettre
<form action="." method="post">
......
<input type="submit" name="form1">
</form>
<form action="." method="post">
......
<input type="submit" name="form2">
</form>
#view
if "form1" in request.POST:
...
if "form2" in request.POST:
...
Si les deux formes sont complètement différentes, il sera certainement pas mal de les manipuler par deux points de vue différents. Dans le cas contraire, vous pouvez utiliser l'astuce « élément input caché » zacherates a abordé. Ou bien, vous pouvez toujours donner à chaque élément submit
uniques nom, et la différence dans la vue qui a été présenté sous forme sur cette base.