Jinja模板子循环优化

时间:2013-04-10 15:30:38

标签: python-2.7 flask jinja2

我在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循环所以我不需要做一个子循环来获取我想要的数据元素?或者,另一个问题,就速度而言,在单个循环中执行它会有什么不同吗?

1 个答案:

答案 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 %}

如果您决定将逻辑移动到视图(如上所述),您还可以在将列表推送到模板之前缓存该列表。