不是动态选择场WTFORMS的有效选择

时间:2012-12-20 01:56:53

标签: python flask wtforms

我目前正在使用WTFORMS创建一个动态选择字段,但它永远不会提交并且验证失败并出现以下错误。

Not a valid choice

我的字段是这样创建的:

area = SelectField()

在视图中,我正在抓住db中的选项:

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

如果我创建静态选项,它会工作。

3 个答案:

答案 0 :(得分:78)

我的猜测是Area.idint - 当数据从客户端返回时,WTForms会将其视为字符串,除非将{cal}传递给{ {1}} wtforms.fields.SelectField构造函数的关键字参数:

coerce

或者,如果您使用的是SQLAlchemy,则可以使用wtforms.ext.sqlalchemy.fields.QuerySelectFieldwtforms_sqlalchemy如果您使用的是WTForms 3 +):

area = SelectField(coerce=int)

答案 1 :(得分:3)

如果没有QuerySelectField,您可以使用以下方法解决问题。

我是这样做的:

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

答案 2 :(得分:0)

请记住在设置 Form 类时也要放置可用的选项。

class MyForm(FlaskForm):
    sel = SelectField(coerce=int, label="MyLabel", choices=my_choices)
    ....

选择可以是这样的:

my_choices = [x.id for x in get_products()]

调用pre_validate函数时脚本/wtforms/fields/core.py中的函数validate_on_submit()出现异常