我想在django模板中为给定条件执行减少forloop.counter的值,是否可以在django中使用。
以下是示例
{% for i in item %}
{% if forloop.counter0|divisibleby:4 %}
Start
{% endif %}
{% if i %}
item{{ forloop.counter }}
{% else %}
######### Here I want to reduce value of forloop.counter by 1 ###########
{% endif %}
{% if forloop.counter|divisibleby:4 %}
End
{% endif %}
{% endfor %}
在上面的代码中,8个完美的项目输出将是
Start
item1
item2
item3
item4
End
Start
item5
item6
item7
item8
End
但假设item2为None,则输出为
Start
item1
item3
item4
End
Start
item5
item6
item7
item8
End
如果不满足条件,我希望每次通过减少forloop的值以适当的升序(每步增加1)的形式打印它。请不要建议自定义模板标签,我知道这一点,我认为它是最后一个选项。
答案 0 :(得分:2)
我真的怀疑django会让你轻易地弄乱forloop.counter
,并且不管怎么说都不会弄乱它。显而易见的解决方案是在迭代之前过滤掉列表,这可以在您的视图中完成,或者(如果您坚持在模板中执行)使用自定义过滤器。
或者您可以将列表包装在生成器函数中,该函数将负责过滤和编号,即:
def filteriternum(seq):
num = 0
for item in seq:
if not item:
continue
num += 1
yield num, item
再次,您可以在视图中进行换行,也可以编写自定义模板过滤器来进行换行。
答案 1 :(得分:1)
也许是这样的:
{% for i in item %}
{% cycle 'Start' '' '' '' %}
{% if i %}
item{{ forloop.counter }}
{% else %}
empty item{{ forloop.counter }}
{% endif %}
{% cycle '' '' '' 'End' %}
{% endfor %}
这是输出:
Start
item1
empty item2
item3
item4
End
Start
item5
item6
item7
item8
End
UPDATE :我发现了一些非常有趣的东西,如何使用'local'变量实际减少forloop.counter:
{% cycle 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 as dec %}
{% for i in item %}
{% cycle 'Start' '' '' '' %}
{% if i %}
item{{ forloop.counter|add:dec }}
{% else %}
<!-- empty {% cycle dec %} here we move to the next decrementing value -->
{% endif %}
{% cycle '' '' '' 'End' %}
{% endfor %}
答案 2 :(得分:0)
改编自Tisho的回答:
{% for i in item %}
{% if i %}
{% cycle 'Start' '' '' '' %}
item{% cycle 1 2 3 4 5 6 7 8 %}
{% cycle '' '' '' 'End' %}
{% endif %}
{% endfor %}
那会输出:
Start
item1
item2
item3
item4
End
Start
item5
item6
item7
item8
End
所以再也没有洞了!但这仅适用于您的数值有限的情况,因为您必须在所使用的第二个cycle
标记中全部写入...
答案 3 :(得分:-2)
如果django模板无法满足,请尝试自己写一个,点击这里django custom template tag