10 Stimmen

Verwendung von Formularwerten aus einem ungebundenen Formular

Ich habe einen Webbericht, der ein Django-Formular (neue Formulare) für Felder verwendet, die die Abfrage steuern, die verwendet wird, um den Bericht zu generieren (Startdatum, Enddatum, ...). Das Problem, das ich habe, ist, dass die Seite mit den ursprünglichen Werten des Formulars (ungebunden) funktionieren sollte, aber ich kann nicht auf das Feld cleaned_data zugreifen, es sei denn, ich rufe is_valid() . Aber is_valid() schlägt bei ungebundenen Formularen immer fehl.

Es scheint, wie Django Formulare wurden mit dem Anwendungsfall der Bearbeitung von Daten, so dass eine ungebundene Form ist nicht wirklich nützlich für etwas anderes als die Anzeige von HTML konzipiert.

Zum Beispiel, wenn ich habe:

if request.method == 'GET':
    form = MyForm()
else:
    form = MyForm(request.method.POST)

if form.is_valid():
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

is_valid() schlägt fehl, wenn es sich um einen GET handelt (da er nicht gebunden ist), und wenn ich:

if request.method == 'GET':
    form = MyForm()
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
else:
    form = MyForm(request.method.POST)
    if form.is_valid():
       do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

der erste Aufruf von do_query löst Ausnahmen für form.cleaned_data aus, das kein gültiges Feld ist, weil is_valid() wurde nicht angerufen. Es scheint, als müsste ich etwas tun wie:

if request.method == 'GET':
    form = MyForm()
    do_query(form['start_date'].field.initial, form['end_date'].field.initial)
else:
    form = MyForm(request.method.POST)
    if form.is_valid():
       do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

d.h. es gibt keine gemeinsame Schnittstelle für das Abrufen der Werte des Formulars zwischen einem gebundenen und einem ungebundenen Formular.

Sieht jemand eine sauberere Möglichkeit, dies zu tun?

7voto

Matthew Christensen Punkte 1731

Wenn Sie diese Methode zu Ihrer Formularklasse hinzufügen:

def get_cleaned_or_initial(self, fieldname):
        if hasattr(self, 'cleaned_data'):
            return self.cleaned_data.get(fieldname)
        else:
            return self[fieldname].field.initial

könnten Sie dann Ihren Code wie folgt umschreiben:

if request.method == 'GET':
    form = MyForm()
else:
    form = MyForm(request.method.POST)
    form.is_valid()

do_query(form.get_cleaned_or_initial('start_date'), form.get_cleaned_or_initial('end_date'))

2voto

zgoda Punkte 12611

Ungebunden bedeutet, dass keine Daten mit dem Formular verbunden sind (entweder ursprünglich oder später bereitgestellt), so dass die Validierung fehlschlagen kann. Wie in anderen Antworten (und in Ihrer eigenen Schlussfolgerung) erwähnt, müssen Sie Anfangswerte angeben und sowohl auf gebundene Daten als auch auf Anfangswerte prüfen.

Der Anwendungsfall für Formulare ist die Formularverarbeitung et Validierung, daher müssen Sie einige Daten validieren, bevor Sie auf die cleaned_data .

0voto

Justin Voss Punkte 6174

Sie können ein Wörterbuch mit Anfangswerten an Ihr Formular übergeben:

if request.method == "GET":
    # calculate my_start_date and my_end_date here...
    form = MyForm( { 'start_date': my_start_date, 'end_date': my_end_date} )
...

Siehe die offizielle Formulare API-Dokumentation , wo sie dies demonstrieren.

editar : Nach den Antworten anderer Benutzer ist dies vielleicht die sauberste Lösung:

if request.method == "GET":
    form = MyForm()
    form['start_date'] = form['start_date'].field.initial
    form['end_date'] = form['end_date'].field.initial
else:
    form = MyForm(request.method.POST)
if form.is_valid():
    do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])

Ich habe dies jedoch noch nicht ausprobiert; kann jemand bestätigen, dass dies funktioniert? Ich denke, dass dies besser ist als die Erstellung einer neuen Methode, da bei diesem Ansatz kein anderer Code (der möglicherweise nicht von Ihnen geschrieben wurde) über Ihren neuen "magischen" Accessor Bescheid wissen muss.

0 Stimmen

Ja, aber dann werden die Standardwerte nicht mit dem Formular definiert (wie mit initial=value in den Felddeklarationen). Wenn Sie das Formular an mehreren Stellen verwenden, müssen Sie Ihre Standardwerte wiederholen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X