Django forloop 索引操作
Posted
技术标签:
【中文标题】Django forloop 索引操作【英文标题】:Django forloop index operations 【发布时间】:2013-11-10 23:06:34 【问题描述】:我很难理解 Django 的 forloop.counter 是什么。我的意图是将for循环的每三个迭代包装在<div>
中。我希望它如何工作是这样的:
% 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 进行操作。在视图中执行此操作似乎过于复杂,我宁愿在模板中执行它,因为它纯粹是一个演示/样式问题。
【问题讨论】:
【参考方案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>
UPDATE处理结束标签。
【讨论】:
【参考方案2】:您需要使用“divisibleby”和cycle(如@falsetru 所述)内置函数,
根据您的具体要求,以下即可,
>>> 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
如果 len(staff_members)%3 != 0,您需要在最后添加额外的 。我希望这会有所帮助。
【讨论】:
【参考方案3】:forloop.counter 给出循环的当前迭代并且是 1-indexed(即 forloop.counter 的第一次迭代值为 1)
【讨论】:
【参考方案4】:这与“Django 不喜欢在柜台上操作”无关。只是 Django 的模板语言在设计上不支持对 any 变量进行此类操作。
正如其他人所指出的,有些标签可以做你想做的事。最简单的方法可能是divisibleby
:
% for staff in staff_members %
% if forloop.counter|divisibleby:3 %
<div class="row">
% endif %
staff
% if forloop.counter0|divisibleby:3 %
</div>
% endfor %
【讨论】:
我明白了。我更熟悉 Twig 模板语言,它有时会模糊视图和模板之间的界限。感谢您的评论:)以上是关于Django forloop 索引操作的主要内容,如果未能解决你的问题,请参考以下文章
Unreal Engine 4 蓝图完全学习教程—— 循环ForLoop
在django模板中对forloop.counter进行加法操作