Jinja2: Создайте новую строку для каждых 3 предметов
В настоящее время для каждой статьи в статьях создается новый div с классом span4.
Вместо этого для каждой строки я хотел бы ограничить ее содержанием тремя интервалами и создать новую строку, как только это ограничение будет достигнуто. Как я могу лучше всего это реализовать?
{% extends "base.html" %}
{% block content %}
<div class="container-fluid">
<legend></legend>
<div class="row-fluid" id="main">
{% for article in articles %}
<div class="span4">
<div class="thumbnail">
<a href="{{ article.url }}"><img src="http://placehold.it/300x150/483CB4"></a>
<div class="caption">
<h4><a href="{{ article.url }}">{{ article.title }}</a></h4>
<p> {{ article.summary }}</p>
</div>
<legend></legend>
<a class="btn" href="#"><i class="icon-thumbs-up"></i></a>
<a class="btn" href="#"><i class="icon-thumbs-down"></i></a>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}
Цель:
<div class="row">
<div class="span4">article[0]</div>
<div class="span4">article[1]</div>
<div class="span4">article[2]</div>
</div>
<div class="row">
<div class="span4">article[3]</div>
<div class="span4">article[4]</div>
<div class="span4">article[5]</div>
</div>
Ответы
Ответ 1
Лучший способ сделать это - использовать встроенный фильтр batch
, чтобы разбить список на группы по три:
{% for article_row in articles | batch(3, ' ') %}
<div class="row">
{% for article in article_row %}
<div class="span4">{{ article }}</div>
{% endfor %}
</div>
{% endfor %}
Ответ 2
Вы можете использовать loop.index0
и loop.last
внутри цикла for
. Вот документация for-loop.
Пример:
{% extends "base.html" %}
{% block content %}
<div class="container-fluid">
<legend></legend>
<div class="row-fluid" id="main">
{% for article in articles %}
{% if loop.index0 % 3 == 0 %}
<div class="row">
{% endif %}
<div class="span4">
...
</div>
{% if loop.index0 % 3 == 2 or loop.last %}
</div>
{% endif %}
{% endfor %}
</div>
</div>
{% endblock %}
Предложение loop.last
должно закрыть последнюю строку, даже если было меньше 3 элементов. <div>
должен начинаться, когда loop.index0
дает 0 в качестве остатка и должен заканчиваться, когда 2 - остаток
Другой альтернативой было бы группировать элементы в строки перед передачей их в шаблон, тогда вы можете просто выпустить два for-loops внутри внутри.