WTForms SelectField没有正确地强制执行布尔值

Ben*_*ler 5 python flask wtforms flask-wtforms

这是我的代码:

class ChangeOfficialForm(Form):
    is_official = SelectField(
        'Officially Approved',
        choices=[(True, 'Yes'), (False, 'No')],
        validators=[DataRequired()],
        coerce=bool
    )
    submit = SubmitField('Update status')
Run Code Online (Sandbox Code Playgroud)

出于某种原因,is_official.data总是如此True.我怀疑我误解了胁迫是如何起作用的.

dav*_*ism 9

虽然您已将 bool 传递给选项,但在 HTML 值中仅使用字符串。因此,您将拥有选择值'True''False'。这两个都是非空字符串,因此当该值被 强制时bool,它们的计算结果都为True。您需要使用不同的可调用对象来为'False'字符串做正确的事情。

您还需要使用InputRequired验证器而不是DataRequired. 如果数据是 False-like,则检查数据失败,而只要输入不为空,检查输入就会验证。

SelectField(
    choices=[(True, 'Yes'), (False, 'No')],
    validators=[InputRequired()],
    coerce=lambda x: x == 'True'
)
Run Code Online (Sandbox Code Playgroud)