【问题标题】:How can I check that variable is changed in jinja2 template?如何检查 jinja2 模板中的变量是否已更改?
【发布时间】:2017-06-22 00:59:30
【问题描述】:

我有要在网页上显示的对象列表(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 %} 不起作用。

【问题讨论】:

    标签: python if-statement jinja2


    【解决方案1】:

    发现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 语法无法做到这一点。

    【讨论】:

    【解决方案2】:

    确实,全局变量通常不在 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 %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 2016-05-23
      • 2010-09-23
      相关资源
      最近更新 更多