我在Flask项目中使用Jinja模板进行以下循环:
<select style="width: 125px;" id="ddlQuarters" name="ddlQuarters">
{% for e in element_values if e.DataKey == 'Quarter' %}
{% for v in e.DataElementValues | reverse %}
<option value="{{ v.DataElementValueId }}">{{ v.Value }}</option>
{% endfor %}
{% endfor %}
</select>
有没有办法优化jinja for循环所以我不需要做一个子循环来获取我想要的数据元素?或者,另一个问题,就速度而言,在单个循环中执行它会有什么不同吗?
答案 0 :(得分:0)
我通常会在模板中尝试避免这样的嵌套循环。我会在控制器/视图中执行此操作,创建一个列表并将我的列表发送到模板。
当然,您的方法完全有效。您是否注意到性能/速度问题?如果是这样,您可能需要考虑实施缓存策略(如果使用Flask http://pythonhosted.org/Flask-Cache/)并直接在模板中缓存您的循环。例如 - 这会将你的循环缓存5分钟:
{% cache 60*5 %}
<select style="width: 125px;" id="ddlQuarters" name="ddlQuarters">
{% for e in element_values if e.DataKey == 'Quarter' %}
{% for v in e.DataElementValues | reverse %}
<option value="{{ v.DataElementValueId }}">{{ v.Value }}</option>
{% endfor %}
{% endfor %}
</select>
{% endcache %}
如果您决定将逻辑移动到视图(如上所述),您还可以在将列表推送到模板之前缓存该列表。
克