【问题标题】:WTForms RadioField preventing form validationWTForms RadioField 阻止表单验证
【发布时间】:2019-04-05 16:45:26
【问题描述】:

我有一个 WTForms 表单,其中包含几种不同类型的字段,除了 RadioField 之外,所有这些字段都有效。

Python: 从 flask_wtf 导入 FlaskForm from 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') 将在我每次按下提交时执行。

但是一旦包含 RadioField,表单就永远不会被验证。我认为这可能是因为该字段没有关联的验证器,但是当我将 validators=[Optional()] 添加到 field_two 定义时它仍然不起作用。

有人知道为什么表单没有通过 RadioField 验证吗?

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

【问题讨论】:

    标签: python flask flask-wtforms wtforms


    【解决方案1】:

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

    【讨论】:

      【解决方案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 比 True 和 False 更好?
      • 当实际的 'False' 值 (str) 被强制转换为 True 时,我只是在运行您的代码时遇到了问题。使用 1 和 0 解决了这个问题。
      猜你喜欢
      • 2018-11-21
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 2016-05-30
      • 2013-11-18
      • 1970-01-01
      相关资源
      最近更新 更多