如何在python-jinja模板中输出loop.counter



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

根据文档,我正在尝试使用一个loop.counter变量:

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

但是正在输出到我的模板中。正确的语法是什么?

循环中的计数器变量在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循环块内部,您可以访问一些特殊变量,例如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

如果您使用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>

现实生活中的例子:

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

在Python代码中:

env = Environment(loader=FileSystemLoader("templates"))
env.globals["enumerate"] = enumerate

在您的模板中:

{% for idx, val in enumerate(list) %}
    {{ idx }}. {{val}}
{% endfor %}

最新更新