2012-12-20 10 views
24

Ich erstelle derzeit ein dynamisches Auswahlfeld mit WTFORMS, jedoch wird die Validierung niemals mit dem folgenden Fehler übergeben und fehlgeschlagen.Keine gültige Auswahl für dynamisches Auswahlfeld WTFORMS

Not a valid choice 

Mein Feld ist wie folgt erstellt:

area = SelectField() 

und in der Ansicht, ich bin Grabbing die Optionen aus dem db etwa so:

form = MytestForm() 
form.area.choices = [(a.id, a.name) for a in Area.objects.all()] 

Es funktioniert aber, wenn ich erstellen statische Optionen.

Antwort

57

Meine Vermutung ist, dass Area.id ist ein int - wenn die Daten vom Client kommt zurück, um es als String von WTForms behandelt wird, es sei denn, eine aufrufbare zum coerce Stichwort Argument des wtforms.fields.SelectField Konstruktor übergeben wird:

area = SelectField(coerce=int) 

Alternativ, wenn Sie SQLAlchemy verwenden könnten Sie wtforms.ext.sqlalchemy.fields.QuerySelectField (wtforms_sqlalchemy wenn Sie WTForms verwenden 3+) verwenden:

area = QuerySelectField(query_factory=Area.objects.all, 
          get_pk=lambda a: a.id, 
          get_label=lambda a: a.name) 
+1

Hallo Sean, danke für die Antwort. Allerdings benutze ich mongodb, also ist die ID eigentlich eine Zeichenkette. – ismail

+4

Danke, es war das Zwangsproblem, WTFORMS war standardmäßig auf die Konvertierung in Unicode, aber das eigentliche Objekt ist ein MongoDB Objekt ID Typ. Also habe ich den Zwang geändert, um eine ObjectID-Instanz zu erstellen, und sie validiert jetzt. – ismail

+2

coerce = int hat es für mich behoben. Konkret war mein Problem, dass meine Auswahlwerte ganze Zahlen 0 und 1 waren. Meine Vermutung ist, dass wtforms dies als False und True interpretierte. Allerdings möchte mein Modell ein Int. Klasse Abc (Basis): foo = Spalte (Integer) Klasse AbcView (Modelview): form_overrides = { 'foo': SELECT, } form_args = { 'foo': { 'Wahlen' : [(0, 'unbekannt'), (1, 'defcon 1')], 'coerce': int } } – coderfi

3

Hier ist, wie Sie es ohne QuerySelectField lösen können.

Hier ist, wie ich getan habe:

years = [(str(y), y) for y in reversed(range(1950, 2013))] 
years.insert(0, ('','year')) 
year = wt.SelectField(choices=years) 
Verwandte Themen