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

ism*_*ail 37 python flask wtforms

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

Not a valid choice
Run Code Online (Sandbox Code Playgroud)

我的字段是这样创建的:

area = SelectField()
Run Code Online (Sandbox Code Playgroud)

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

form = MytestForm()
form.area.choices = [(a.id, a.name) for a in Area.objects.all()]
Run Code Online (Sandbox Code Playgroud)

但是,如果我创建静态选项,它会工作.

Sea*_*ira 87

我的猜测是,Area.idint-当数据从它被视为一个客户端回来的字符串,除非调用传递给由WTForms coerce中的关键字参数wtforms.fields.SelectField的构造函数:

area = SelectField(coerce=int)
Run Code Online (Sandbox Code Playgroud)

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

area = QuerySelectField(query_factory=Area.objects.all,
                            get_pk=lambda a: a.id,
                            get_label=lambda a: a.name)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢这是强制问题,WTFORMS默认转换为unicode,但实际对象是MongoDB对象ID类型.所以我改变了强制来创建一个ObjectID实例,它现在验证了. (4认同)
  • 亲爱的@SeanVieira非常感谢wtforms.ext.sqlalchemy.fields.QuerySelectField.它救了我一辈子:) (3认同)
  • coerce = int为我修好了.具体来说,我的问题是我的选择值恰好是整数0和1.我的猜测是wtforms将其解释为False和True.但是,我的模型想要一个int.class Abc(Base):foo = Column(Integer)类AbcView(ModelView):form_overrides = {'foo':SelectField,} form_args = {'foo':{'choices':[(0,'unknown'),( 1,'defcon 1')],'coerce':int}} (2认同)
  • coerce = int - 为我工作,但对于其他情况.谢谢! (2认同)

Ric*_*son 7

这是在没有 QuerySelectField 的情况下解决它的方法。

这是我的做法:

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


Wol*_*ahl 6

3.01 Pullrequest添加了必要的参数:

 validate_choice=True
Run Code Online (Sandbox Code Playgroud)

考虑到这个问题已经有 33,000 次浏览,截至 2022 年 1 月有 52 个赞成票,因此关闭该功能似乎常常是有问题的。

 SelectField(coerce=int, validate_choice=False) 
Run Code Online (Sandbox Code Playgroud)

让我成为一名快乐的露营者