Jinja2:为每3个项目创建一个新行

时间:2013-07-22 21:40:04

标签: flask jinja2

目前,文章中的每篇文章都会创建一个类为span4的新div。 相反,对于每一行,我想将其内容限制为三个跨度,并在达到该限制后创建一个新行。我怎样才能最好地实现这个目标?

{% 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>

2 个答案:

答案 0 :(得分:35)

最好的方法是使用内置的batch filter将您的列表分成三个一组:

{% for article_row in articles | batch(3, '&nbsp;') %}
<div class="row">
    {% for article in article_row %}
    <div class="span4">{{ article }}</div>
    {% endfor %}
</div>
{% endfor %}

答案 1 :(得分:5)

您可以在loop.index0循环中使用loop.lastfor。这是for-loop documentation

示例:

{% 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 %}

即使少于3个项目,loop.last子句也应关闭最后一行。 <div>应该在loop.index0给出0作为余数时开始,并且应该在2为余数时结束

另一种选择是在将项目传递到模板之前将项目分组为行,然后您可以在另一个内部发布两个for循环。