Jinja的循环变量在包含的模板中不可用

15 投票
2 回答
6508 浏览
提问于 2025-04-17 10:00

我在我的一个jinja模板中有类似下面的代码

{% for post in posts %}
    {% include ["posts/" + post.type + ".html", "posts/default.html"] %}
{% endfor %}

这个代码的目的是根据每个post的类型,从posts集合中渲染出每个帖子。我为每种post.type设置了不同的模板。而那些没有模板的帖子,则会使用default的帖子模板。

现在,我想在帖子模板中显示从底部开始的帖子索引,这个索引是通过loop.revindex提供的。但不知为什么,如果我在帖子模板中使用loop.revindex,就会出现一个错误,提示UndefinedError: 'loop' is undefined

所以,loop在被include的模板中不可用吗?这是设计使然吗?还是说我在组织模板时做错了什么,导致它不可用?

编辑 好吧,我想出了一个变通办法,在for循环中,在包含我的模板之前,我这样做

{% set post_index = loop.revindex %}

然后在帖子模板中使用post_index。虽然这不是最理想的办法,但似乎是唯一的解决方案。不过我还是想知道你们的解决办法。

编辑 2 还有一件事,我可以在被include的模板中访问post变量,但无法访问loop变量。

2 个回答

2

另一种选择是通过将一个本地变量设置为 loop,把整个 loop 变量传递到包含的模板中。

{% for post in posts %}
    {% set post_loop = loop %}
    {% include ["posts/" + post.type + ".html", "posts/default.html"] %}
{% endfor %}

这样你就可以访问到所有 loop 的属性,对我来说,这样在包含的模板中更清楚这个变量是什么。

9

你可以试试用 {% with %} 这个语句。

可以这样做:

{% with %}
    {% set loop_revindex = loop.revindex %}
    {% include ... %}
{% endwith %}

在被包含的模板里,不要用 loop.revindex,而是用 loop_revindex

撰写回答