我有一个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>
答案 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)