(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
何それ、なぜのためのテンプレートコードでしょうか?
完璧、ありがとうございます! – Joseph