2012-12-20 20 views
24

Aktualnie tworzę dynamiczne pole wyboru przy użyciu WTFORMS, jednak nigdy nie przesyła i nie sprawdza poprawności z następującym błędem.Nieprawidłowy wybór dla dynamicznego pola wyboru WTFORMS

Not a valid choice 

moje pole jest tworzony tak:

area = SelectField() 

aw widzenia jestem chwytając opcje z db tak:

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

Działa jednak jeśli utworzyć opcje statyczne.

Odpowiedz

57

Domyślam się, że Area.id jest int - jeżeli dane wraca od klienta jest ona traktowana jako ciąg przez WTForms chyba wywoływalnym jest przekazywana do argumentu coerce kluczowego konstruktora wtforms.fields.SelectField:

area = SelectField(coerce=int) 

Alternatywnie, jeśli używasz SQLAlchemy można użyć wtforms.ext.sqlalchemy.fields.QuerySelectField (wtforms_sqlalchemy jeśli używasz WTForms 3+):

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

Cześć Sean dzięki za odpowiedź. Jednak używam mongodb, więc id jest w rzeczywistości ciągiem. – ismail

+4

Dzięki temu, że był to problem typu "przymus", WTFORMS domyślnie konwertował na kod Unicode, jednak rzeczywisty obiekt to typ identyfikatora obiektu MongoDB. więc zmieniono wiązkę, aby utworzyć instancję ObjectID, i teraz sprawdza ona poprawność. – ismail

+2

coerce = int naprawiono dla mnie. W szczególności, moim problemem było to, że moje wartości wyborów były liczbami całkowitymi 0 i 1. Domyślam się, że wtompy interpretowały to jako fałszywe i prawdziwe. Jednak mój model chce int. klasy ABC (zasada): xxx = kolumnowej (całkowita) klasy AbcView (ModelView) form_overrides = { 'foo' SelectField, } form_args = { 'foo' { 'wyboru' : [(0, "nieznany"), (1, "defcon 1")], 'coerce': int } } – coderfi

3

Oto, jak możesz go rozwiązać bez QuerySelectField.

Oto jak to zrobiłem:

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