52

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

Not a valid choice

我的字段是这样创建的:

area = SelectField()

在视图中,我正在从数据库中获取选项,如下所示:

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

但是,如果我创建静态选项,它会起作用。

4

3 回答 3

114

我的猜测是,Area.idint数据从客户端返回时,WTForms 会将其视为字符串,除非将可调用对象传递给构造函数的coerce关键字参数wtforms.fields.SelectField

area = SelectField(coerce=int)

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

area = QuerySelectField(query_factory=Area.objects.all,
                            get_pk=lambda a: a.id,
                            get_label=lambda a: a.name)
于 2012-12-20T03:37:19.567 回答
7

以下是在没有 QuerySelectField 的情况下如何解决它。

这是我的做法:

years = [(str(y), y) for y in reversed(range(1950, 2013))]
years.insert(0, ('','year'))
year = wt.SelectField(choices=years)
于 2013-11-20T09:30:01.440 回答
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()

于 2021-06-16T09:19:10.807 回答