选择jinja2模板中的单选按钮

时间:2017-05-08 21:51:51

标签: python forms templates jinja2

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

问:如何干净利落,没有太多代码重复?

以下是我目前的解决方案。它有效,但它很难看,而且有超过2个单选按钮,它很快就会变得很难管理。可能有更好的方法。

我使用两个字符串变量(对于2个无线电btns)。根据偏好设置,其中一个将为空,另一个将设置为“已检查”:

{% 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! -->

然后我在模板中使用这些字符串:

<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>

1 个答案:

答案 0 :(得分:0)

我会将indexchecked和backchecked的计算从模板移到代码中。您还可以使用字典解压缩将较少的参数传递给render_template方法。

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)