(tl;dr は下部にあります)
私が達成しようとしていることを説明してみましょう: 私は 2 次元配列を持っており、その内容を特定の方法で表示したいと考えています。「行」が必要ですが、適切な言葉がないため、各行に表示できる「オブジェクト」は 3 つまでです。そのため、配列を反復処理して、その過程で HTML を作成したいと考えています。私の考えは次のとおりです。配列内のすべての「3 つの最初の」要素は「行」を開く必要があります。「3 分の 3」の要素ごとに「行」を閉じる必要があります。ただし、[inner] 配列の最後の要素がたまたま「3 分の 3」でない場合でも、行を閉じる必要があります。したがって、たとえば、次のようなものがある場合、次のようL=[ [0,1,2,3,4], [5,6,7] ]
に表示したいと思います。
0 1 2
3 4
5 6 7
次のようにマークアップできます。
<div>0 1 2</div>
<div>3 4</div>
<div>5 6 7</div>
私が最初に考えたのは、単純にモジュロ演算子を使用して、各反復が行の「1 番目」、「2 番目」、または「3 番目」であるかどうかを確認することでしたが、Django テンプレートはモジュロを直接サポートしていません (詳細は後述)。
そこで、次のようなテンプレート コードを思いつきました。
{% for x in L %}
{% for y in x %}
{% cycle '<div>' '' '' %}
{{ y }}
{% cycle '' '' '</div>' %}
{% endfor %}<br/>
{% endfor %}
そして、これは良いスタートでした。上記の例を0
取り上げると、div を開く、1
何もしない、2
div を閉じる、3
開く、という具合です。 「3 つのシリーズの 3 番目」ではなかった4
ので、閉じません。 4
. したがって、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 を閉じています!
だから、ここからどこへ行けばいいのかわからない。これは Django の既知の未修正の問題のようです。誰でも助けてもらえますか?
tl;dr私は 2 次元配列を取りたいと思っています。たとえばL=[ [0,1,2,3,4], [5,6,7] ]
、一度に 3 つ以下のグループを適切にマークアップし、複数の配列の要素をグループ化することなく、次のようにします。
0 1 2
3 4
5 6 7
そのためのテンプレート コードは何で、その理由は何ですか?