Warum füllt ein einfaches Wörterbuch obj nicht richtig für form = myForm (obj = dict)?

8

Ich habe Probleme, ein Formular mit einem Wörterbuch zu füllen:

%Vor%

fügt keine Daten in form ein (d. h. form.vorname.data = Keine nach dem vorhergehenden).

Der Anfang der Formulardefinition wird unten angezeigt. Ich weiß nicht, was ich als nächstes versuchen soll. Die Formulardokumentation sagt nur:

  

obj - Wenn formdata leer oder nicht angegeben ist, wird dieses Objekt auf Attribute geprüft, die mit Feldnamen übereinstimmen, die für Feldwerte verwendet werden.

%Vor%     
pgoetz 01.05.2013, 21:53
quelle

4 Antworten

14

Das Problem ist, dass die WTForms nur getattr verwenden Überprüfen Sie, ob der Feldname in obj vorhanden ist (es wird nicht versucht, __getitem__ aufzurufen). Sie können anstelle eines Wörterbuchs ein namedtuple verwenden oder Ihre Daten weitergeben als Schlüsselwortargumente ( form = RolodexEntry(**row) ).

    
Sean Vieira 02.05.2013, 01:57
quelle
6

Diese Antwort wurde der Vollständigkeit halber aufgenommen. Wie von Sean Vieira aufgezeigt, verwendet WTForms getattr , um Attributnamen zu erhalten, was bei Wörterbüchern nicht funktioniert. Verwenden der akzeptierten Antwort von

Python-Diktat in Objekt konvertieren?

Das funktioniert auch:

%Vor%     
pgoetz 02.05.2013 21:19
quelle
1

Obwohl diese Frage vor einiger Zeit gestellt wurde, schlage ich vor, Sean Vieiras Antwort auf ein Duplikat dieser Frage zu sehen. Wie in seiner Antwort erklärt, wird jede Klasse mit einer Schnittstelle, die getlist enthält, vom Konstruktor wtforms.Form akzeptiert.

    
Philippe Hebert 13.05.2016 17:38
quelle
0

Als ich flask_wtf benutzt habe, habe ich festgestellt, dass Flasks Formularklasse mich verpfuscht hat. Ich denke, das war das gleiche Problem von @ wgwz's Kommentar zu @ pgoetz's Antwort. Das Flask-Formular füllt automatisch Formulardaten mit Daten aus der Anfrage. Da mein "RolodexEntry" ein in ein größeres Formular eingebettetes FormField war, waren die automatisch aufgefüllten Formulardaten ungültig. Um zu versuchen, dies zu beheben, habe ich die Form von Wtforms subklassifiziert, anstatt Flasks Form zu unterklassifizieren.

    
John 20.05.2016 23:29
quelle

Tags und Links