Frage

Ich habe einen Web-Bericht, der eine Django Form (neue Formen) für die Felder verwendet, die die Abfrage verwendet, steuern den Bericht (Startdatum, Enddatum, ...) zu erzeugen. Das Problem, das ich habe, ist, dass die Seite funktionieren sollte die Form der Anfangswerte (ungebunden), aber ich kann das cleaned_data Feld nicht zugreifen, wenn ich is_valid () aufrufen. Aber is_valid () nicht immer auf ungebundenen Formen.

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

Zum Beispiel, wenn ich:

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 ein GET ist (da es ungebunden), 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 auf form.cleaned_data, die kein gültiges Feld ist, weil is_valid () noch 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'])

das heißt, es für das Abrufen des Formulars Wert zwischen gebundener Form und einem ungebunden man nicht eine gemeinsame Schnittstelle ist.

Sieht jemand einen sauberere Weg, dies zu tun?

War es hilfreich?

Lösung

Wenn Sie diese Methode zur 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

Sie könnten dann neu schreiben Ihren Code 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'))

Andere Tipps

Ungebundene bedeutet, dass es keine Daten mit der Form (entweder anfängliche oder später vorgesehen) zugeordnet ist, so kann die Validierung fehlschlägt. Wie in anderen Antworten erwähnt (und in Ihrem eigenen Abschluss), haben Sie Anfangswerte zu schaffen und sowohl für die gebundenen Daten zu überprüfen und Anfangswerte.

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

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} )
...

Sehen Sie die offiziellen Formulare API-Dokumentation , sofern sie nachweisen können dies.

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 habe dies aber nicht versucht; kann jemand bestätigen, dass das funktioniert? Ich denke, das ist besser als eine neue Methode zu schaffen, da dieser Ansatz nicht anderen Code erfordert (möglicherweise nicht von Ihnen geschrieben) über Ihr neues ‚magisches‘ Accessor kennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top