1

我很难理解 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 上进行操作。在视图中执行此操作似乎过于复杂,我宁愿在模板中执行此操作,因为它纯粹是一个演示/样式问题。

4

4 回答 4

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 %}
于 2013-10-31T10:31:31.280 回答
1

您可以使用cycle标签

例如:

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>

更新句柄结束标记。

于 2013-10-31T03:54:05.510 回答
0

您将需要使用“ divisibleby ”以及循环(如@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,您将需要在最后添加额外的 <\div>。我希望这会有所帮助。

于 2013-10-31T05:18:48.637 回答
0

forloop.counter 给出循环的当前迭代并且是 1-indexed (即 forloop.counter 的第一次迭代值为 1)

于 2013-10-31T05:28:15.483 回答