2012-12-20 45 views
24

我目前正在使用WTFORMS創建一個動態選擇字段,但它從不提交併且未通過驗證並顯示以下錯誤。動態選擇字段不是有效選擇WTFORMS

Not a valid choice 

我場創建這樣的:

area = SelectField() 

,並在視圖中,我從數據庫抓取的選項,如下所示:

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

它的工作原理但是如果我創建靜態選項。

回答

57

我的猜測是Area.idint - 當數據從它被WTForms除非調用傳遞給wtforms.fields.SelectField構造的coerce關鍵字參數視爲字符串客戶回來:

area = SelectField(coerce=int) 

或者,如果你正在使用的SQLAlchemy你(如果你使用WTForms 3+ wtforms_sqlalchemy)可以使用wtforms.ext.sqlalchemy.fields.QuerySelectField

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

嗨肖恩,爲響應感謝。不過,我使用的是mongodb,所以id實際上是一個字符串。 – ismail

+4

感謝這是脅迫問題,WTFORMS默認轉換爲unicode,但實際的對象是MongoDB對象ID類型。所以我改變了強制創建一個ObjectID實例,它現在驗證。 – ismail

+2

coerce = int爲我解決了它。 具體來說,我的問題是,我的選擇值碰巧是整數0和1. 我的猜測是wtforms解釋爲False和True。 但是,我的模型想要一個int。 ABC類(鹼): 富=柱(整數) 類AbcView(模型視圖): form_overrides = { '富':SelectField, } form_args = { '富':{ '選擇' :[(0,'unknown'),(1,'defcon 1')], 'coerce':int } } – coderfi

3

下面是你可以如何解決它沒有QuerySelectField。

這裏是我做的事:

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