2012-12-20 5 views
24

Attualmente sto creando un campo di selezione dinamico utilizzando WTFORMS, tuttavia non invia e non interrompe la convalida con il seguente errore.Non una scelta valida per il campo di selezione dinamico WTFORMS

Not a valid choice 

Il mio campo è creato in questo modo:

area = SelectField() 

e nella vista, sto afferrando le opzioni dal db in questo modo:

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

Funziona se creo opzioni statiche.

risposta

57

mia ipotesi è che Area.id è un int - quando i dati torna dal client viene trattato come una stringada WTForms a meno che un callable viene passato al coerce parola chiave parametro al costruttore del wtforms.fields.SelectField:

area = SelectField(coerce=int) 

In alternativa, se si utilizza SQLAlchemy si potrebbe usare wtforms.ext.sqlalchemy.fields.QuerySelectField (wtforms_sqlalchemy se si utilizza WTForms 3+):

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

Hi Sean, grazie per la risposta. Comunque sto usando mongodb, quindi l'id è in realtà una stringa. – ismail

+4

Grazie al problema coercitivo, WTFORMS era in default per la conversione in Unicode, tuttavia l'oggetto reale è un tipo ID oggetto MongoDB. così ho cambiato la coercizione per creare un'istanza ObjectID e ora la convalida. – ismail

+2

coerce = int lo ha risolto per me. In particolare, il mio problema era che i valori delle mie scelte erano gli interi 0 e 1. Tuttavia, il mio modello vuole un int. classe Abc (Base): foo = Colonna (intero) classe AbcView (modelview): form_overrides = { 'foo': SelectField, } form_args = { 'foo': { 'scelte' : [(0, 'sconosciuto'), (1, 'defcon 1')], 'coerce': int } } – coderfi

3

Ecco come puoi risolverlo senza QuerySelectField.

Ecco come ho fatto:

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