如何在Python Jinja模板中输出循环计数器(loop.counter)?

277

我希望能够将当前循环迭代输出到我的模板中。

根据文档,有一个loop.counter变量可供使用:

<ul>
{% for user in userlist %}
  <li>
      {{ user }} {{loop.counter}}
  </li>
      {% if loop.counter == 1 %}
          This is the First user
      {% endif %}
{% endfor %}
</ul>

但是信息已经被输出到我的模板中了。正确的语法是什么?
5个回答

568
在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/

9
如果有嵌套的for循环,它会如何工作?在嵌套的for循环中如何访问外层for循环的索引? - Vivasvan Patel
可以将外部循环索引存储在变量中。请参见:https://dev59.com/9HI_5IYBdhLWcg3wAeHl#1567300 - Opsse

113
for循环块中,您可以访问一些特殊变量,例如loop.index(但不是loop.counter)。来自官方文档
变量 描述
loop.index 当前循环的迭代次数。(从1开始索引)
loop.index0 当前循环的迭代次数。(从0开始索引)
loop.revindex 距离循环末尾的迭代次数。(从1开始索引)
loop.revindex0 距离循环末尾的迭代次数。(从0开始索引)
loop.first 如果是第一次迭代,则为True。
loop.last 如果是最后一次迭代,则为True。
loop.length 序列中的项目数量。
loop.cycle 在一个序列的列表之间循环的辅助函数。
loop.depth 指示当前呈现的递归循环深度。从级别1开始
loop.depth0 指示当前呈现的递归循环深度。从级别0开始
loop.previtem 上一次循环的项目。在第一次迭代期间未定义。
loop.nextitem循环的下一个迭代中的项。在最后一次迭代期间未定义。
loop.changed(*val) 如果之前使用不同的值调用(或根本没有调用),则为True。

32
如果你正在使用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>

我遇到了 jinja2.exceptions.UndefinedError: 'forloop' is undefined 的错误。 - Harsha Biyani
使用Jinja时,请使用loop,这里是文档。而forloop则是用于Django模板的。 - Daniel Butler
3
这个问题明显是在询问jinja,为什么我们在这里回答有关Django模板的问题... - Abdul Aziz Barkat

0

现实生活中的例子:

{% 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 %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接