Ответ 1
Попробуйте что-то вроде этого:
<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>
Я создаю каталог, в котором есть список элементов неопределенной длины. Я хочу выплюнуть его рядами по три столбца каждый. Итак, у меня есть следующий 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? Как я могу разбить его так, чтобы новая строка начиналась после трех элементов?
Попробуйте что-то вроде этого:
<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>
Вы можете попытаться создать настраиваемый фильтр шаблонов, который вернет список из 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 %}
Вы можете использовать переменную 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 %}
Извините, у меня недостаточно репутации, чтобы просто комментировать jpic answer (принятый), для 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>
подробности здесь.