能否在Jinja2模板层设置FlaskForms单选按钮默认值?
在Jinja2模板层为Flask-WTF单选按钮设置默认值
场景背景
我有如下FlaskForm定义:
from flask_wtf import FlaskForm from wtforms import RadioField, SubmitField class DialectPreferenceForm(FlaskForm): dialect = RadioField('SQL Choice', choices=[('firebird','Firebird'),('mysql','MySQL'),('bothsql','Both')]) dialect_submit = SubmitField("Set choice")
对应的原始模板代码:
<form method="POST" action=""> {{ form_sql.hidden_tag() }} {{ form_sql.dialect }}<br/> {{ form_sql.dialect_submit }} </form>
我希望只在Jinja2模板层,根据传入的参数param设置单选按钮的默认值,不想在视图层或表单定义里处理。之前查到的类似问题都是用原生HTML实现的,想知道Flask-WTF下能不能这么做,我自己写的模板代码如下,但不确定是否可行:
<form method="POST" action=""> {{ form_sql.hidden_tag() }} {% if param == 1 %} {{ form_sql.dialect(default='firebird') }} {% elif param == 2 %} {{ form_sql.dialect(default='mysql') }} {% elif param == 3 %} {{ form_sql.dialect(default='bothsql') }} {% endif %} {{ form_sql.dialect_submit }} </form>
解答
可以在模板层实现,但你写的方法不会生效——Flask-WTF的字段渲染不支持直接通过default参数在模板里设置选中状态,需要手动遍历单选按钮的选项,控制checked属性。
修改后的模板代码如下:
<form method="POST" action=""> {{ form_sql.hidden_tag() }} {% set default_value = '' %} {% if param == 1 %} {% set default_value = 'firebird' %} {% elif param == 2 %} {% set default_value = 'mysql' %} {% elif param == 3 %} {% set default_value = 'bothsql' %} {% endif %} {% for subfield in form_sql.dialect %} {{ subfield(**{'checked': subfield.data == default_value}) }} {{ subfield.label }}<br/> {% endfor %} {{ form_sql.dialect_submit }} </form>
或者更直观的手动渲染写法:
<form method="POST" action=""> {{ form_sql.hidden_tag() }} {% for subfield in form_sql.dialect %} {% set is_checked = False %} {% if (param == 1 and subfield.data == 'firebird') or (param == 2 and subfield.data == 'mysql') or (param == 3 and subfield.data == 'bothsql') %} {% set is_checked = True %} {% endif %} <input type="radio" name="{{ subfield.name }}" id="{{ subfield.id }}" value="{{ subfield.data }}" {% if is_checked %}checked{% endif %}> <label for="{{ subfield.id }}">{{ subfield.label.text }}</label><br/> {% endfor %} {{ form_sql.dialect_submit }} </form>
说明
Flask-WTF的RadioField渲染时,默认选中状态由表单字段的data或default属性控制。要在模板层动态修改,必须手动遍历每个选项,通过判断参数param给对应单选按钮添加checked属性,才能正确设置默认选中项。
这种写法完全不需要在视图层或表单定义里修改默认值,符合你的需求。
内容的提问来源于stack exchange,提问作者Suzanne
相关产品推荐
相关产品推荐

