J'ai une page de modèle qui attend deux formulaires. Si je n'utilise qu'un seul formulaire, les choses vont bien comme dans cet exemple typique:
if request.method == 'POST':
form = AuthorForm(request.POST,)
if form.is_valid():
form.save()
# do something.
else:
form = AuthorForm()
Si je veux travailler avec plusieurs formulaires, comment puis-je faire savoir à la vue que je ne soumets qu'un seul des formulaires et pas l'autre (c'est-à-dire qu'il s'agit toujours d'une demande.POST mais je veux uniquement traiter le formulaire pour lequel la soumission arrivé)?
Il s'agit de la solution basée sur la réponse où la phrase attendue et la phrase interdite sont les noms des boutons d' envoi pour les différents formulaires et la forme attendue et la phrase interdite sont les formulaires.
if request.method == 'POST':
if 'bannedphrase' in request.POST:
bannedphraseform = BannedPhraseForm(request.POST, prefix='banned')
if bannedphraseform.is_valid():
bannedphraseform.save()
expectedphraseform = ExpectedPhraseForm(prefix='expected')
elif 'expectedphrase' in request.POST:
expectedphraseform = ExpectedPhraseForm(request.POST, prefix='expected')
if expectedphraseform.is_valid():
expectedphraseform.save()
bannedphraseform = BannedPhraseForm(prefix='banned')
else:
bannedphraseform = BannedPhraseForm(prefix='banned')
expectedphraseform = ExpectedPhraseForm(prefix='expected')
Réponses:
Vous avez quelques options:
Mettez différentes URL dans l'action pour les deux formulaires. Ensuite, vous aurez deux fonctions d'affichage différentes pour gérer les deux formulaires différents.
Lisez les valeurs du bouton d'envoi à partir des données POST. Vous pouvez dire sur quel bouton de soumission a été cliqué: Comment puis-je créer plusieurs boutons de soumission sous forme django?
la source
Une méthode de référence future est quelque chose comme ça. bannedphraseform est le premier formulaire et attenduphraseform est le second. Si le premier est touché, le second est ignoré (ce qui est une hypothèse raisonnable dans ce cas):
la source
handled = False
qui est mise à jour àTrue
quand se trouve une forme compatible?Les vues basées sur les classes de Django fournissent un FormView générique mais à toutes fins utiles, il est conçu pour ne gérer qu'un seul formulaire.
Une façon de gérer plusieurs formulaires avec la même URL d'action cible en utilisant les vues génériques de Django consiste à étendre le «TemplateView» comme indiqué ci-dessous; J'utilise cette approche assez souvent pour en faire un modèle IDE Eclipse.
Le modèle html a l'effet suivant:
la source
J'avais besoin de plusieurs formulaires validés indépendamment sur la même page. Les concepts clés qui me manquaient étaient 1) l'utilisation du préfixe de formulaire pour le nom du bouton de soumission et 2) un formulaire illimité ne déclenche pas la validation. Si cela aide quelqu'un d'autre, voici mon exemple simplifié de deux formulaires AForm et BForm utilisant TemplateView basé sur les réponses de @ adam-nelson et @ daniel-sokolowski et un commentaire de @zeraien ( https://stackoverflow.com/a/17303480 / 2680349 ):
la source
data = request.POST if prefix in next(iter(request.POST.keys())) else None
Sinon çain
ne marchait pas.Je voulais partager ma solution là où les formulaires Django ne sont pas utilisés. J'ai plusieurs éléments de formulaire sur une seule page et je souhaite utiliser une seule vue pour gérer toutes les demandes POST de tous les formulaires.
Ce que j'ai fait, c'est que j'ai introduit une balise d'entrée invisible afin que je puisse passer un paramètre aux vues pour vérifier quel formulaire a été soumis.
views.py
la source
C'est un peu tard, mais c'est la meilleure solution que j'ai trouvée. Vous créez un dictionnaire de recherche pour le nom du formulaire et sa classe, vous devez également ajouter un attribut pour identifier le formulaire, et dans vos vues, vous devez l'ajouter en tant que champ masqué, avec le
form.formlabel
.J'espère que cela vous aidera à l'avenir.
la source
Si vous utilisez une approche avec des vues basées sur la classe et différentes attrs "action", je veux dire
Vous pouvez facilement gérer les erreurs de différents formulaires en utilisant une
get_context_data
méthode surchargée , par exemple:views.py:
modèle:
la source
vue:
modèle:
la source
Voici un moyen simple de gérer ce qui précède.
Dans le modèle HTML, nous mettons Post
En vue
Dans l'URL Donnez les informations nécessaires comme
la source