WTForms RadioField 阻止表单验证
WTForms RadioField preventing form validation
我有一个 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')
将在我每次按下提交时执行。
但是一旦包含 RadioField,表单就永远不会被验证。我想这可能是因为该字段没有关联的验证器,但是当我将 validators=[Optional()]
添加到 field_two
定义时它仍然不起作用。
有人知道为什么表单没有用 RadioField 验证吗?
(我已经尝试了我能想到的四个选项。单击提交并选择和不选择单选选项,并在表单定义中添加和删除可选验证器。)
我相信这是因为类型检查。你应该告诉它像这样强制转换为布尔值:
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)
我遇到了同样的问题,发现可行的解决方案是创建一个父级 class 来验证 RadioField class(有关代码,请参阅 https://github.com/wtforms/wtforms/issues/477)。
RadioFields 验证失败是一个已知问题。
为了解决无线电字段的验证问题,添加 validate_choice=False
似乎对我有用 class:
radioChoice = RadioField("Example", choices=[("cpp", "C++"), ("py", "Python"), ("text", "Plain Text")], validate_choice=False)
我有一个 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')
将在我每次按下提交时执行。
但是一旦包含 RadioField,表单就永远不会被验证。我想这可能是因为该字段没有关联的验证器,但是当我将 validators=[Optional()]
添加到 field_two
定义时它仍然不起作用。
有人知道为什么表单没有用 RadioField 验证吗?
(我已经尝试了我能想到的四个选项。单击提交并选择和不选择单选选项,并在表单定义中添加和删除可选验证器。)
我相信这是因为类型检查。你应该告诉它像这样强制转换为布尔值:
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)
我遇到了同样的问题,发现可行的解决方案是创建一个父级 class 来验证 RadioField class(有关代码,请参阅 https://github.com/wtforms/wtforms/issues/477)。 RadioFields 验证失败是一个已知问题。
为了解决无线电字段的验证问题,添加 validate_choice=False
似乎对我有用 class:
radioChoice = RadioField("Example", choices=[("cpp", "C++"), ("py", "Python"), ("text", "Plain Text")], validate_choice=False)