我很难理解Django的forloop.counter是什么。我的目的是在<div>
中包含for循环的每三次迭代。我期望它如何工作是这样的:
{% for staff in staff_members %}
{% if (forloop.counter + 2 % 3) == 0 %} // if loop is the first of three
<div class="row">
{% endif %}
{{ staff }}
// close <div class="row"> if loop is last of three
{% endfor %}
这不起作用,因为似乎Django不喜欢在forloop.counter上运行。在视图中执行此操作似乎过于复杂,我宁愿在模板中执行此操作,因为它纯粹是一个表达/样式问题。
答案 0 :(得分:2)
这与“Django不喜欢在柜台上操作”无关。根据设计,Django的模板语言不支持任何变量上的那些操作。
正如其他人所说,有些标签可以做你想要的。最简单的方法可能是divisibleby
:
{% for staff in staff_members %}
{% if forloop.counter|divisibleby:3 %}
<div class="row">
{% endif %}
{{ staff }}
{% if forloop.counter0|divisibleby:3 %}
</div>
{% endfor %}
答案 1 :(得分:1)
您可以使用cycle
tag。
例如:
from django.template import Template, Context
t = Template("""
{% for staff in staff_members %}
{% cycle '<div class="row">' '' '' as div %}
{{ staff }}
{% cycle '' '' '</div>' as div %}
{% endfor %}
{% if not staff_members|length|divisibleby:3 %}
</div>
{% endif %}
""")
print t.render(Context({'staff_members': [1,2,3,4,5,6,7,8]}))
打印(删除一些空行以便于阅读)
<div class="row">
1
2
3
</div>
<div class="row">
4
5
6
</div>
<div class="row">
7
8
</div>
更新处理结束标记。
答案 2 :(得分:0)
您需要使用&#39; divisibleby&#39;以及cycle(如@falsetru所述)builtins,
根据您的具体要求,以下是
>>> t3 = Template("""
... {% for staff in staff_members %}
... {% cycle '<div class="row">' '' '' %}
... {{staff}}
... {%if forloop.counter|divisibleby:'3' %}
... </div>
... {%endif%}
... {%endfor%}
... """)
>>> print t3.render(Context({'staff_members': [1,2,3,4,5,6,7,8,9,10]}))
<div class="row">
1
2
3
</div>
<div class="row">
4
5
6
</div>
<div class="row">
7
8
9
</div>
<div class="row">
10
您需要添加额外的&lt; \ div&gt;最后如果len(staff_members)%3!= 0.我希望这有帮助。