如何使用Jinja2模板制作一个简单的计数器?

a p*_*erd 13 python templates jinja2

我有两个for循环,两者都有尊严.我想在每次内部迭代期间增加一个计数器.

例如,考虑以下模板:

from jinja2 import Template

print Template("""
{% set count = 0 -%}
{% for i in 'a', 'b', 'c' -%}
  {% for j in 'x', 'y', 'z' -%}
    i={{i}}, j={{j}}, count={{count}}
    {% set count = count + 1 -%}
  {% endfor -%}
{% endfor -%}
""").render()
Run Code Online (Sandbox Code Playgroud)

这打印不应该count=0通过count=8吗?不,它没有.

i=a, j=x, count=0
i=a, j=y, count=1
i=a, j=z, count=2
i=b, j=x, count=0
i=b, j=y, count=1
i=b, j=z, count=2
i=c, j=x, count=0
i=c, j=y, count=1
i=c, j=z, count=2
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?

注意:我不能简单地保存外部loop变量来计算计数器,因为在我的软件中,内部迭代的数量是可变的.

a p*_*erd 15

使用可变的内部组大小,这将起作用:

from jinja2 import Template

items = [
    ['foo', 'bar'],
    ['bax', 'quux', 'ketchup', 'mustard'],
    ['bacon', 'eggs'],
    ]

print Template("""
{% set counter = 0 -%}
{% for group in items -%}
  {% for item in group -%}
    item={{ item }}, count={{ counter + loop.index0 }}
  {% endfor -%}
  {% set counter = counter + group|length %}
{% endfor -%}
""").render(items=items)
Run Code Online (Sandbox Code Playgroud)

...打印:

item=foo, count=0
  item=bar, count=1

item=bax, count=2
  item=quux, count=3
  item=ketchup, count=4
  item=mustard, count=5

item=bacon, count=6
  item=eggs, count=7
Run Code Online (Sandbox Code Playgroud)

我想在外面超过一个范围的范围内声明的变量不能分配给什么.