我有这个超级愚蠢的代码:
{% set count = 0 %}
{% for key in 'foo', 'bar': %}
{% for x in 'a', 'b': %}
{{count}}
{% set count = count + 1 %}
{% endfor %}
{% endfor %}
我得到的是" 0 1 0 1"而不是" 0 1 2 3"。
为什么?!
答案 0 :(得分:3)
这是一种hacky解决方案(这是基于这个答案:Jinja2: Change the value of a variable inside a loop):
{% set count = {'value': 0} %}
{% for key in 'foo', 'bar': %}
{% for x in 'a', 'b': %}
{{count.value}}
{% if count.update({'value': (count.value + 1)}) %} {% endif %}
{% endfor %}
{% endfor %}
您的代码中发生的事情是set
是一个赋值运算符。由于您在嵌套循环中调用set,因此嵌套循环中的计数是一个不同的变量。
因此,为了解决这个问题,你可以使用我所链接的答案中所示的字典。
接下来,你需要再做一次黑客攻击,即使用空的if语句来更新dict。您不能只执行以下操作,因为它会导致jinja语法错误:
{% count.update({'value': (count.value + 1)}) %}
另一个选择是创建自己的jinja函数,然后你可以做这样的事情:
{% set count = {'value': 0} %}
{% for key in 'foo', 'bar': %}
{% for x in 'a', 'b': %}
{{count.value}}
{{ increment_count(count) }}
{% endfor %}
{% endfor %}
在这里,我创建了一个名为increment_count
的函数:
def increment_count(count):
count['value'] += 1
return ''
计数返回一个空字符串,因此我们不必使用空的if语句。我通常使用带有Jinja的Flask。使用Flask,您可以使用上下文处理器添加功能:http://flask.pocoo.org/docs/0.10/templating/#context-processors
答案 1 :(得分:0)
我认为这更干净:
{% set count = [] %}
{% for key in 'foo', 'bar': %}
{% for x in 'a', 'b': %}
{{count|length}}
{% set var = count.append(1) %}
{% endfor %}
{% endfor %}
答案 2 :(得分:-2)
我不确定这是否是Python。但它被标记为pythonic问题。如果你用Python编写这个函数。您将获得所需的输出。
count= 0
l=[]
for key in "foo", "bar":
for x in 'a','b':
l+=[count]
count+=1
print l
输出:[0,1,2,3]