我目前正在使用WTFORMS创建动态选择字段,但它从未提交,并在验证时出现以下错误。
Not a valid choice
我的领域是这样创建的:
area = SelectField()
在我的视图中,我正在从数据库中获取选项,代码如下:
form = MytestForm()
form.area.choices = [(a.id, a.name) for a in Area.objects.all()]
如果我创建静态选项,它就能正常工作。
我目前正在使用WTFORMS创建动态选择字段,但它从未提交,并在验证时出现以下错误。
Not a valid choice
我的领域是这样创建的:
area = SelectField()
在我的视图中,我正在从数据库中获取选项,代码如下:
form = MytestForm()
form.area.choices = [(a.id, a.name) for a in Area.objects.all()]
如果我创建静态选项,它就能正常工作。
我猜测 Area.id
是一个 int
- 当数据从客户端返回时,如果没有向 coerce
关键字参数传递可调用对象,WTForms 会将其视为 字符串,这是由 wtforms.fields.SelectField
构造函数处理的:
area = SelectField(coerce=int)
或者,如果你正在使用SQLAlchemy,你可以使用wtforms.ext.sqlalchemy.fields.QuerySelectField
(如果你正在使用WTForms 3+,则使用wtforms_sqlalchemy
):
area = QuerySelectField(query_factory=Area.objects.all,
get_pk=lambda a: a.id,
get_label=lambda a: a.name)
以下是不需要使用QuerySelectField解决该问题的方法。
以下是我所采用的方法:
years = [(str(y), y) for y in reversed(range(1950, 2013))]
years.insert(0, ('','year'))
year = wt.SelectField(choices=years)
3.01版本的Pullrequest添加必要的参数:
validate_choice=True
如果这个功能存在缺陷,并且已经有33k次阅读和2022年1月的52个赞,您可以关闭它。
SelectField(coerce=int, validate_choice=False)
记得在设置表单类时同时加入可用选项。
class MyForm(FlaskForm):
sel = SelectField(coerce=int, label="MyLabel", choices=my_choices)
....
选择可以是这样的:
my_choices = [x.id for x in get_products()]
当调用validate_on_submit()
函数时,在脚本/wtforms/fields/core.py
中的pre_validate
函数中出现了异常。