Python 在jinja2模板中选择一个单选按钮

Python 在jinja2模板中选择一个单选按钮,python,forms,templates,jinja2,Python,Forms,Templates,Jinja2,我有一个jinja2模板和一个简单的用户首选项表单。首选项作为python字典传递到render_template()函数中。根据设置,我需要将组中的一个单选按钮标记为选中 问:如何做到干净,无需太多代码重复 下面是我目前的解决方案。它可以工作,但很难看,有两个以上的单选按钮,很快就会变得很难管理。也许有更好的办法 我使用两个字符串变量(用于2个无线基站)。其中一个将为空,另一个将根据首选项设置设置为“已检查”: {% if user_prefs['when_done'] == 'index'

我有一个jinja2模板和一个简单的用户首选项表单。首选项作为python字典传递到render_template()函数中。根据设置,我需要将组中的一个单选按钮标记为选中

问:如何做到干净,无需太多代码重复

下面是我目前的解决方案。它可以工作,但很难看,有两个以上的单选按钮,很快就会变得很难管理。也许有更好的办法

我使用两个字符串变量(用于2个无线基站)。其中一个将为空,另一个将根据首选项设置设置为“已检查”:

{% if user_prefs['when_done'] == 'index' %}
    {% set indexchecked = 'checked' %}
    {% set backchecked = '' %}
{% else %}
    {% set indexchecked = '' %}
    {% set backchecked = 'checked' %}
{% endif %}
<!-- With more radio buttons here, this would be a mess! -->
{%if user\u prefs['when\u done']=='索引'%}
{%set indexchecked='已检查'%}
{%set backchecked=''%}
{%else%}
{%set indexchecked=''%}
{%set backchecked='已检查'%}
{%endif%}
然后我在模板中使用这些字符串:

<form action="{{ url_for('prefs') }}" method="post">
    <fieldset>
        <div class="radio text-left">
        <p><strong>After completing a task:</strong></p>
          <label>
            <input type="radio" name="when_done" value="index" {{ indexchecked }}>
            Return to homepage
          </label>
          <br/>
          <label>
            <input type="radio" name="when_done" value="task" {{ taskchecked }}>
            Go to next task
          </label>
        </div>

        <div class="form-group">
            <button class="btn btn-default" type="submit">Update preferences</button>
        </div>
    </fieldset>
</form>

完成任务后:

返回主页
转到下一个任务 更新首选项
我会将indexchecked和backchecked的计算从模板移到代码中。还可以使用字典解包,以便向render_模板方法传递较少的参数

do_index = user_prefs['when_done'] == 'index'
index_checked = 'checked' if do_index else ''
back_checked = '' if do_index else 'checked'

render_template('pages/something.html', form=some_form, index_checked=index_checked, back_checked=back_checked)
为了减少传递的参数数量,可以使用dict进行解包:

template_parameters = dict(form=some_form, index_checked=index_checked, back_checked=back_checked)
render_template('pages/something.html', **template_parameters)