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 操作

在django模板中对forloop.counter进行加法操作

CRM手记-6 | Django

如何在 django 模板中设置自定义 forloop 起点

如何从不同的索引启动 forloop.counter