2013-07-22 9 views
12

現在、記事の記事ごとに、span4の新しいdivが作成されます。 代わりに各行について、3つのスパンにコンテンツを制限し、その制限に達すると新しい行を作成したいと思います。どのように私はこれを最も実装することができますか?Jinja2:3つのアイテムごとに新しい行を作成

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

答えて

19

これを行うための最善の方法は、3のグループにリストを分割する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

私が探していたまさに。私はすべてのJinja2のドキュメントをよく読んでいます。ありがとう。 – cryptojuice

+0

こんにちは、素晴らしい解決策、もし私が最初の行に3要素、2行目に4要素、3行目に3要素、4行目に4要素を交互に表示したいのですが? –

+0

次に、独自のバージョンのフィルタが必要です.1つのフィルタを書くことはそれほど難しくありませんが、このコメントの余白は小さすぎてコードを入れることができません。あなたがこれまで持っているものと一緒に、別の質問を書いてください。 :-) –

4

あなたはforループ内loop.index0loop.lastを使用することができます。ここには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 %} 

loop.last句は、3つの未満の項目があった場合でも、最後の行を閉じなければなりません。 <div>は、loop.index0が残りの部分に0を与え、残りが2のときに終了する必要があります。

もう1つの方法は、項目をテンプレートに渡す前に行をグループ化することです。もう片方。

関連する問題