如何在 python jinja 模板中输出 loop.counter?
Posted
技术标签:
【中文标题】如何在 python jinja 模板中输出 loop.counter?【英文标题】:How to output loop.counter in python jinja template? 【发布时间】:2012-08-22 03:28:41 【问题描述】:我希望能够将当前循环迭代输出到我的模板。
根据the docs,我正在尝试使用loop.counter
变量:
<ul>
% for user in userlist %
<li>
user loop.counter
</li>
% if loop.counter == 1 %
This is the First user
% endif %
% endfor %
</ul>
但是正在输出到我的模板。正确的语法是什么?
【问题讨论】:
【参考方案1】:循环内的计数器变量在 Jinja2 中称为loop.index
。
>>> from jinja2 import Template
>>> s = "% for element in elements %loop.index % endfor %"
>>> Template(s).render(elements=["a", "b", "c", "d"])
1 2 3 4
除了loop.index
,还有
loop.index0
(索引从0
开始)
loop.revindex
(反向索引;以1
结尾)
loop.revindex0
(反向索引;以0
结尾)
更多信息请访问http://jinja.pocoo.org/docs/templates/。
【讨论】:
如果有嵌套for循环怎么办?它将如何在那里工作?嵌套for内部时如何访问外部for循环的索引?【参考方案2】:在for
-loop 块中,您可以访问一些特殊变量,例如loop.index
(但不能访问loop.counter
)。来自the official docs:
Variable | Description |
---|---|
loop.index |
The current iteration of the loop. (1 indexed) |
loop.index0 |
The current iteration of the loop. (0 indexed) |
loop.revindex |
The number of iterations from the end of the loop (1 indexed) |
loop.revindex0 |
The number of iterations from the end of the loop (0 indexed) |
loop.first |
True if first iteration. |
loop.last |
True if last iteration. |
loop.length |
The number of items in the sequence. |
loop.cycle |
A helper function to cycle between a list of sequences. |
loop.depth |
Indicates how deep in a recursive loop the rendering currently is. Starts at level 1 |
loop.depth0 |
Indicates how deep in a recursive loop the rendering currently is. Starts at level 0 |
loop.previtem |
The item from the previous iteration of the loop. Undefined during the first iteration. |
loop.nextitem |
The item from the following iteration of the loop. Undefined during the last iteration. |
loop.changed(*val) |
True if previously called with a different value (or not called at all). |
【讨论】:
【参考方案3】:如果您使用的是 Django,请使用 forloop.counter
而不是 loop.counter
:
<ul>
% for user in userlist %
<li>
user forloop.counter
</li>
% if forloop.counter == 1 %
This is the First user
% endif %
% endfor %
</ul>
【讨论】:
【参考方案4】:现实生活中的例子:
% for image in item['images'] %
% set image_id = item_id ~ '-preview-' ~ loop.index0 %
<div id=" image_id " class="overlay">
<a class="cancel" href="# item_id "></a>
<div class="popup">
% set src = image if image.startswith('http') else '/static/images/store/' ~ item_id ~ '/' ~ image %
<a href=" src "><img class="modal-img" src=" src "/></a>
</div>
</div>
% endfor %
【讨论】:
【参考方案5】:在您的 Python 代码中:
env = Environment(loader=FileSystemLoader("templates"))
env.globals["enumerate"] = enumerate
在您的模板中:
% for idx, val in enumerate(list) %
idx . val
% endfor %
【讨论】:
以上是关于如何在 python jinja 模板中输出 loop.counter?的主要内容,如果未能解决你的问题,请参考以下文章
python 如何使用Markdown作为Jinja2模板中的过滤器,然后直接从模板中提取Markdown Meta属性。假设你
带有缓存加载器的 Jinja2 与 django 模板 - 性能比较如何?
GAE / Python / jinja2 / 如何在join语句中引用子目录