2017-05-08 104 views
0

我有一個簡單的用戶首選項表單的jinja2模板。首選項作爲Python字典傳遞到render_template()函數中。根據不同的設置,我需要將組中的一個單選按鈕標記爲已選中。在jinja2模板中選擇一個單選按鈕

問:如何幹淨地做,沒有太多的代碼重複?

下面是我目前的解決方案。它很有用,但它很醜,而且有兩個以上的單選按鈕,很快就會變得難以管理。可能有更好的方法。

我使用兩個字符串變量(爲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

我會將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) 

爲了減少傳遞的參數的數量,您可以使用字典與拆包:

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