python - WTForms RadioField 阻止表单验证
问题描述
我有一个 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)
推荐阅读
- java - 使用 PowerMock 模拟静态最终方法调用返回 null
- javascript - 如何从 SparkAR 中的 lastValue 中删除警告
- docker - Shopware 6 Docker 设置添加 PHPMyAdmin
- javascript - 在 Microsoft Teams 选项卡中对用户进行身份验证 getContext 说明
- vba - 鼠标单击后无法更改活动文本框并设置焦点
- python - 如果使用 prefetch_related django,则为空 M2M 数据
- android - 图像在 Cardvew 中时不显示
- java - Spring StateMachine 可重用状态机实例
- angular - 有没有办法通过点击 ag-grid 中的扩展箭头将 agGroupCellRenderer 参数传递给自定义组件?
- email - 以 png 内嵌图像的形式发送电子邮件是否会增加我的隐私和抵抗被监视的能力?