2008-09-16 2 views
7

Ich habe einen Webbericht, der ein Django-Formular (neue Formulare) für Felder verwendet, die die zum Generieren des Berichts verwendete Abfrage steuern (Startdatum, Enddatum, ...). Das Problem, das ich habe, ist, dass die Seite mit den Anfangswerten des Formulars funktionieren sollte (nicht gebunden), aber ich kann nicht auf das Feld cleaned_data zugreifen, wenn ich nicht is_valid() aufruft. Aber is_valid() schlägt bei ungebundenen Formularen immer fehl.So verwenden Sie Formularwerte aus einem ungebundenen Formular

Es scheint, als ob Djangos Formulare mit dem Anwendungsfall der Bearbeitung von Daten entworfen wurden, so dass ein ungebundenes Formular für nichts anderes als das Anzeigen von HTML wirklich nützlich ist.

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 dies ist ein GET (da es ungebunden ist), und wenn ich tun:

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 in form.cleaned_data aus, was kein gültiges Feld ist, weil is_valid() nicht aufgerufen wurde. Es scheint, als ob ich etwas zu tun haben, 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']) 

, die es gibt, ist nicht eine gemeinsame Schnittstelle für die Form der Werte zwischen gebundener Form abzurufen und einem ungebundenen ein.

Wer sieht einen saubereren Weg, dies zu tun?

Antwort

4

Wenn Sie diese Methode zum Formular-Klasse 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 neu schreiben, wie:

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')) 
0

Sie können ein Wörterbuch der Anfangswerte in das 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}) 
... 

die official forms API documentation See, wo sie dies zu demonstrieren.

bearbeiten: Basierend auf den Antworten von anderen Benutzern, vielleicht ist dies 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 dies allerdings nicht versucht haben; kann jemand bestätigen, dass das funktioniert? Ich denke, das ist besser als eine neue Methode zu erstellen, weil dieser Ansatz keinen anderen Code benötigt (möglicherweise nicht von Ihnen geschrieben), um von Ihrem neuen magischen Accessor zu erfahren.

+0

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

1

Unbound bedeutet, es gibt keine Daten mit Formular zugeordnet (entweder initial 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 die gebundenen Daten als auch die Anfangswerte prüfen.

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

Verwandte Themen