如何在 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属性。假设你

Ansible Jinja2 模板概述 --01

带有缓存加载器的 Jinja2 与 django 模板 - 性能比较如何?

GAE / Python / jinja2 / 如何在join语句中引用子目录

无法在带有气流的 jinja 模板中使用 python 变量

自动化运维工具-Ansible Jinja2模板