5

(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何もしない、2div を閉じる、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

そのためのテンプレート コードは何で、その理由は何ですか?

4

1 に答える 1

14

を使用して、タグ{% if forloop.counter0|divisibleby:"3" %}を開くタイミングとタグを閉じるタイミングを決定できる必要があります。<div>{% if forloop.last or forloop.counter|divisibleby:"3" %}</div>

{% 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 %}
于 2012-07-27T00:13:28.973 に答える