Django forloop索引操作

时间:2013-10-31 03:47:20

标签: python django for-loop django-templates

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

3 个答案:

答案 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.我希望这有帮助。