我正在创建一个目录,其中有一个未定义长度的项目列表。我想把它吐出来,每行有三列。所以我有以下html:
<div class="row">
<div class="three columns">item 1
</div>
<div class="three columns">item 2
</div>
<div class="three columns">item 3
</div>
</div>
<div class="row">
<div class="three columns">item 4
</div>
<div class="three columns">item 5
</div>
<div class="three columns">item 6
</div>
</div>
我不知道如何将其作为django模板实现?如何拆分它以便在三个项目之后开始新行?
答案 0 :(得分:34)
尝试这样的事情:
<div class="row">
{% for item in items %}
<div class="three columns">{{ item }}
</div>
{% if forloop.counter|divisibleby:3 %}
</div>
<div class="row">
{% endif %}
{% endfor %}
</div>
答案 1 :(得分:4)
您可以尝试创建自定义模板过滤器,该过滤器将返回 3项列表列表。
快速尝试:
@register.filter
def splitByThree(data):
return [l[i:i+3] for i in range(0, len(l), 3)]
然后在你的模板中:
{% load splitByThree %}
{% for list in data|splitByThree %}
<div class="row">
{% for item in list %}
<div class="three columns">{{ item }}</div>
{% endfor %}
</div>
{% endfor %}
答案 2 :(得分:4)
您可以使用forloop.counter
变量和divisibleby
过滤器。代码将接近于此:
{% for item in items %}
{% if forloop.first %}
<div class="row">
{% endif %}
<div class="three columns">{{ item }}</div>
{% if forloop.counter|divisibleby:"3" %}
</div>
{% if not forloop.last %}
<div class="row">
{% endif %}
{% endif %}
{% if forloop.last %}
</div>
{% endif %}
{% endfor %}
答案 3 :(得分:1)
抱歉没有足够的声誉来评论 jpic 的答案(已接受的答案),对于 Jinja2 ,请使用:
<div class="row">
{% for item in items %}
<div class="three columns">{{ item }}
</div>
{% if loop.index is divisibleby(3) %}
</div>
<div class="row">
{% endif %}
{% endfor %}
</div>
详情为here。