Ich habe eine Vorlagenseite, die zwei Formulare erwartet. Wenn ich nur ein Formular verwende, sind die Dinge in Ordnung wie in diesem typischen Beispiel:
if request.method == 'POST':
form = AuthorForm(request.POST,)
if form.is_valid():
form.save()
# do something.
else:
form = AuthorForm()
Wenn ich jedoch mit mehreren Formularen arbeiten möchte, wie kann ich der Ansicht mitteilen, dass ich nur eines der Formulare und nicht das andere sende (dh es ist immer noch request.POST, aber ich möchte nur das Formular verarbeiten, für das die Übermittlung erfolgt passierte)?
Dies ist die Lösung, die auf der Antwort basiert, wobei Expectedphrase und Bannedphrase die Namen der Senden- Schaltflächen für die verschiedenen Formulare sind und Expectedphraseform und Bannedphraseform die Formulare sind.
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')
Antworten:
Sie haben einige Möglichkeiten:
Fügen Sie für die beiden Formulare unterschiedliche URLs in die Aktion ein. Dann haben Sie zwei verschiedene Ansichtsfunktionen, um mit den zwei verschiedenen Formen umzugehen.
Lesen Sie die Werte der Senden-Schaltfläche aus den POST-Daten. Sie können erkennen, auf welche Schaltfläche zum Senden geklickt wurde: Wie kann ich ein Django-Formular für mehrere Senden-Schaltflächen erstellen?
quelle
Eine Methode für zukünftige Referenz ist so etwas. Die verbotene Phrasenform ist die erste Form und die erwartete Phrasenform ist die zweite. Wenn der erste getroffen wird, wird der zweite übersprungen (was in diesem Fall eine vernünftige Annahme ist):
quelle
handled = False
, das aktualisiert wird,True
wenn ein kompatibles Formular gefunden wird?Die klassenbasierten Ansichten von Django bieten eine generische FormView, die jedoch in jeder Hinsicht nur für ein Formular ausgelegt ist.
Eine Möglichkeit, mehrere Formulare mit derselben Zielaktions-URL mithilfe der generischen Ansichten von Django zu verarbeiten, besteht darin, die 'TemplateView' wie unten gezeigt zu erweitern. Ich verwende diesen Ansatz oft genug, um ihn zu einer Eclipse-IDE-Vorlage zu machen.
Die HTML-Vorlage hat folgenden Effekt:
quelle
Ich brauchte mehrere Formulare, die unabhängig voneinander auf derselben Seite validiert wurden. Die Schlüsselkonzepte, die mir fehlten, waren 1) die Verwendung des Formularpräfixes für den Namen der Senden-Schaltfläche und 2) ein unbegrenztes Formular löst keine Validierung aus. Wenn es jemand anderem hilft, ist hier mein vereinfachtes Beispiel für zwei Formen AForm und BForm mit TemplateView, basierend auf den Antworten von @ adam-nelson und @ daniel-sokolowski und dem Kommentar von @zeraien ( https://stackoverflow.com/a/17303480) / 2680349 ):
quelle
data = request.POST if prefix in next(iter(request.POST.keys())) else None
Sonstin
hat es nicht funktioniert.Wollte meine Lösung teilen, wenn Django Forms nicht verwendet werden. Ich habe mehrere Formularelemente auf einer Seite und möchte eine einzige Ansicht verwenden, um alle POST-Anforderungen aus allen Formularen zu verwalten.
Ich habe ein unsichtbares Eingabe-Tag eingeführt, damit ich einen Parameter an die Ansichten übergeben kann, um zu überprüfen, welches Formular gesendet wurde.
views.py
quelle
Das ist etwas spät, aber das ist die beste Lösung, die ich gefunden habe. Sie erstellen ein Suchwörterbuch für den Formularnamen und seine Klasse, Sie müssen auch ein Attribut hinzufügen, um das Formular zu identifizieren, und in Ihren Ansichten müssen Sie es als verstecktes Feld mit dem hinzufügen
form.formlabel
.Ich hoffe, dass dies in Zukunft helfen wird.
quelle
Wenn Sie einen Ansatz mit klassenbasierten Ansichten und verschiedenen 'Aktions'-Attributen verwenden, meine ich
Mit der überladenen
get_context_data
Methode können Sie Fehler aus verschiedenen Formularen problemlos behandeln , z.views.py:
Vorlage:
quelle
Aussicht:
Vorlage:
quelle
Hier ist eine einfache Möglichkeit, mit den oben genannten Problemen umzugehen.
In HTML-Vorlage setzen wir Post
Im Hinblick auf
In URL Geben Sie benötigte Informationen wie
quelle