如何在jinja2模板中检查变量是否已更改?

时间:2017-06-22 00:59:30

标签: python if-statement jinja2

我有要在网页上显示的对象列表(HTML文件)。 对象的类型(图形,表格等)与情况不同。

如果有图形对象,我应该加载关于图形的js和css文件。

因为当列表中没有图形对象时,我不想加载图形的js,css文件, 我已经实现了以下jinja2模板HTML文件。

{% block body %}
    {% set has_graph = 0 %}
    {% for item in components %}
        {% if item.form == 'graph' %}
            {% set has_graph = 1 %}
        {% endif %}
    {% endfor %}
    {% if has_graph == 1 %}
        <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js"></script>
    {% endif %}
{% endblock %}

我发现{%set has_graph = 1%}有效,但未加载js文件。

我不知道为什么{%if has_graph == 1%}不起作用。

2 个答案:

答案 0 :(得分:0)

我发现set语句的范围不能超出jinja2文档(http://jinja.pocoo.org/docs/2.9/templates/#id12)中的循环。

  

请记住,无法在块内设置变量并将其显示在块外。这也适用于循环。该规则的唯一例外是if语句不引入范围。因此,以下模板无法实现您的预​​期:

{% set iterated = false %}
    {% for item in seq %}
        {{ item }}
        {% set iterated = true %}
    {% endfor %}
{% if not iterated %} did not iterate {% endif %}
  

使用Jinja语法无法做到这一点。

答案 1 :(得分:0)

确实,全局变量通常不在Jinja中for循环的作用域之内,这使许多人(使用Python,Java等的用户感到惊讶)。

但是,解决方法是在该外部范围内声明一个字典对象,然后在for循环中使用它:

{% set foundItem = { 'found': False } %}
    {% for item in seq %}
        {%- if item.form == "graph" %}
            {%- if foundItem.update({'found':True}) %} {%- endif %}
        {%- endif %}
    {% endfor %}
{% if not iterated %} did not iterate {% endif %}
{% if foundItem.flag %} pull in graph CSS/JS {% endif %}