jinja2中如何修改多层for循坏外的变量

遇到了一个问题,简化了一下代码,代码如下:

{% set temp =1 %}
{% for a in range(2) %}
    {% for b in range(3) %}
        {% for c in range(4) %}
            {% for d in range(5) %}
                {% set temp = 5 %}
             {% endfor %}
        {% endfor %}
    {% endfor %}
{% endfor %}
{{temp}}

最终打印出来的temp是1,实在没弄清楚这个temp的生存作用域。如果想修改这个temp该怎么做?
在stackoverflow上看到一个不知道是不是类似的问题,英语不是太好,大概看下来好像是一个问题?
https://stackoverflow.com/que...

阅读 6.8k
2 个回答

建议有需要的时候,去文档里面找,特别是原英文文档。

{% set ns = namespace(found=false) %}
{% for item in items %}
    {% if item.check_something() %}
        {% set ns.found = true %}
    {% endif %}
    * {{ item.title }}
{% endfor %}
Found item having something: {{ ns.found }}

个人理解如下:

jinja2 的变量、循环结构体或条件结构体都必须在一个 block 也就是块中才有效,所以你的代码应该在外层加上一个 block。详细解释看注释。

{% block content %}  <!-- content 块 -->
{% set temp =1 %} <!-- 类似于一个全局变量 -->
{% for a in range(2) %}
    {% for b in range(3) %}
        {% for c in range(4) %}
            {% for d in range(5) %}
                {% set temp = 5 %} <!-- 类似于是一个循环结构体内的局部变量 -->
                {{ temp }} <!-- 这里的 temp 应该等于 5 -->
             {% endfor %}
        {% endfor %}
    {% endfor %}
{% endfor %} 
{{temp}} <!-- 类似于调用了一个全局变量,所以这里的 temp 应该等于 1 -->

{% endblock %}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题