2012-07-26 10 views
5

(TL;下部にDR)ジャンゴ、テンプレート、forループ、およびサイクル

私が達成しようとしているかを説明してみましょう:私は2次元配列を持っている、と私は表示したいですその内容はある意味で。私は「行」が必要で、各行はより良い言葉がないため、3つ以上の「オブジェクト」を表示することはできません。ですから、配列全体を繰り返し処理し、その過程でHTMLを作成したいと考えています。私の考えはこれです:配列の "最初の3つ"のすべての要素は、 "行"を開く必要があります。 3つの要素のすべてが「行」を閉じるべきです。しかし、[inner]配列の最後の要素が "three of three"にならない場合は、行を閉じなければなりません。私の最初の考えは単純に使用することでした

<div>0 1 2</div> 
<div>3 4</div> 
<div>5 6 7</div> 

:マークアップされるかもしれない

0 1 2 
3 4 

5 6 7 

のように:私たちはL=[ [0,1,2,3,4], [5,6,7] ]のようなものを持っていたのであれば、例えば、私はそうのようにそれを表示したいです各反復が行の「最初」、「2番目」、または「3番目」であるかどうかを確認しますが、Djangoテンプレートはモジュロを直接サポートしません(詳細は後で説明します)。

だから私はこのようなテンプレートコードを思い付いた:

{% for x in L %} 
{% for y in x %} 
    {% cycle '<div>' '' '' %} 
    {{ y }} 
    {% cycle '' '' '</div>' %} 
{% endfor %}<br/> 
{% endfor %} 

そして、これは良いスタートでした。上の例を取っ​​て、0の場合、1は何もしません。2 divを閉じ、3を開き、4 ... 4は「3番目」ではなかったので、一連の3 "である。だから、Djangoテンプレートはモジュロを持たないが、divisiblebyチェックをしているので、[inner] forループの最後の要素に当たっても、3で割り切れるわけではないという追加のロジックを思いついた。 (クローズされていないので)、divを閉じます。

{% for x in z %} 
{% for y in x %} 
    {% cycle '<div>' '' '' %} 
    {{ y }} 
    {% cycle '' '' '</div>' %} 

    {% if forloop.last %} 
    {% if forloop.counter|divisibleby:"3" %} 
    <!-- Row Already Closed --> 
    {% else %} 
    </div> 
    {% endif %} 
    {% endif %} 

{% endfor %}<br/> 
{% endfor %} 

これはうまくいきました。さて、最初の内側の配列全体に適切なマークアップを付けました。私の問題はこれです:明らかにDjangoのサイクル機能は、内部forループのスコープを外に出てもリセットされません。これは、上の例の番号5がdivのように開いていないことを意味し、サイクルの最初のものとして認識されていません。実際には、実際には3番目と認識されているので、divを終了しています!

ここからどこに行くのかは分かりません。これはknown and unfixed issues in Djangoのようです。誰でも助けてくれますか?

tl; dr私は2次元配列を取っています。 L=[ [0,1,2,3,4], [5,6,7] ]と正しくはそうのように、時と一緒に複数のアレイから任意の要素をグループ化することなく、3以下でグループ化していないそれをマークアップ:

0 1 2 
3 4 

5 6 7 

何それ、なぜのためのテンプレートコードでしょうか?

答えて

14

あなたは<div>タグを開くために、そして</div>タグを閉じるようにするとき{% if forloop.last or forloop.counter|divisibleby:"3" %}を判断する時期を決定するために{% if forloop.counter0|divisibleby:"3" %}を使用することができるはずです。

{% for x in z %} 
{% for y in x %} 
    {% if forloop.counter0|divisibleby:"3" %}<div>{% endif %} 
    {{ y }} 
    {% if forloop.last or forloop.counter|divisibleby:"3" %}</div>{% endif %} 
{% endfor %}<br/> 
{% endfor %} 
+0

完璧、ありがとうございます! – Joseph

関連する問題