WTForms RadioField阻止表单验证

时间:2018-11-01 12:49:46

标签: python flask flask-wtforms wtforms

我有一个WTForms表单,其中包含一些不同类型的字段,除RadioField之外的所有其他字段都起作用。

Python:     从flask_wtf导入FlaskForm     从wtforms导入验证器RadioField,DecimalField

class MyForm(FlaskForm):
    field_one = DecimalField('Field 1', validators=[Optional()]
    field_two = RadioField('Radio', choices=[(True, 'True'), (False, 'False')])
    submit = SubmitField('Submit')

@app.route('/page', methods=['GET', 'POST'])
def page():
    form = MyForm()
    print('Page requested')

    if form.validate_on_submit():
        print('form validated')

    return render_template('/page.html', form=form)

HTML:

<form method="POST">
  <div class="row">
    {{ form.hidden_tag() }}
    {{ form.field_one.label }}
    <div>
      {{ form.field_one }}
    </div>
  </div>
  <div class="row">
    {{ form.hidden_tag() }}
    {{ form.field_two.label }}
    <div>
      {% for subfield in form.field_two %}
        <p>{{ subfield }} - {{ subfield.label }}
      {% endfor %}
    </div>
  </div>
</form>

当我取出与field_two(RadioField)有关的任何内容时,print('form validated')会在我每次按Submit时执行。

但是一旦包含RadioField,就永远不会验证该表单。我以为是因为该字段没有关联的验证器,但是当我在validators=[Optional()]定义中添加field_two时,该字段仍然无法正常工作。

有人知道为什么不使用RadioField验证表单吗?

(我尝试了可以​​想到的四个选项。单击带有和不选择单选选项的提交,并在表单定义中添加和删除可选验证器。)

2 个答案:

答案 0 :(得分:2)

我相信是因为类型检查。您应该这样告诉它强制转换为布尔值:

field_two = RadioField('Radio', coerce=bool, choices=[(True, 'True'), (False, 'False')])

编辑:或者甚至更好,使用1和0并像这样强制int:

field_two = RadioField('Radio', coerce=int, choices=[(1, 'True'), (0, 'False')])

然后您可以检查值是否为真,或将其转换为布尔值,如下所示:

bool(form.field_two.data)

答案 1 :(得分:0)

我遇到了同样的问题,发现可行的解决方案是制作一个用于验证RadioField类的父类(有关代码,请参见https://github.com/wtforms/wtforms/issues/477)。 RadioFields无法验证是一个已知问题。