web-dev-qa-db-ja.com

Django複数の行セットを持つテンプレートでの代替行の色分け

Djangoテンプレートには、テンプレートのさまざまなポイントで(またはテンプレートのループで)いくつかの値を交互に使用するための組み込みタグcycleが用意されていますが、このタグは、cycles定義。つまり、テンプレートに2つ以上のリストがあり、すべての行でcss定義oddevenを使用する場合、リストの最初の行が選択されます選択肢(oddeven)からの新しいイテレーションではなく、最後が終了したところまで

たとえば、次のコードで、最初のブログのエントリ数が奇数の場合、2番目のブログの最初のエントリは、evenから開始したい場合、oddとして開始されます。

{% for blog in blogs %}
  {% for entry in blog.entries %}
    <div class="{% cycle 'odd' 'even' %}" id="{{entry.id}}">
      {{entry.text}}
    </div>
  {% endfor %}
{% endfor %}

私はここで提供されているresetcycleタグでパッチを適用してこれを回避しようとしました:

Djangoチケット:範囲外に出ると、サイクルタグはリセットされます

無駄に。 (コードは私にとってはうまくいきませんでした。)

また、内部ループをカスタムタグに移動しようとしましたが、これも機能しませんでした。おそらく、コンパイル/レンダリングサイクルがループを外部ループに戻したためでしょうか。 (理由に関係なく、うまくいきませんでした。)

どうすればこの簡単なタスクを達成できますか?私の見解では、この情報を事前にコンパイルしてデータ構造を作成したくないのですが。それは不要のようです。前もって感謝します。

58
Carl G

最も簡単な回避策(resetcycleパッチが修正されて適用されるまで)は、forloop.counterで組み込みの「divisibleby」フィルターを使用することです。

{% for entry in blog.entries %}
  <div class="{% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}" id="{{ entry.id }}">
    {{ entry.text }}
  </div>
{% endfor %}

もう少し冗長ですが、理解するのは難しくありません。

111
Carl Meyer

https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#cycle

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}
14
Matt

タグ付きのcycleresetcycle(Django 1.11の新機能)呼び出し( https://docs.djangoproject.com/en /1.11/ref/templates/builtins/#std:templatetag-resetcycle ):

{% for blog in blogs %}
  {% cycle 'odd' 'even' as rowcolors silent %}
  {% resetcycle rowcolors %}
  {% for entry in blog.entries %}
    {% cycle rowcolors %}
    <div class="{{ rowcolors }}" id="{{entry.id}}">
      {{ entry.text }}
    </div>
  {% endfor %}
{% endfor %}
3
emi

最終的には、forloop.counter0を使用してそうします。

{% for product in products %}

    {% if forloop.counter0|divisibleby:4 %}<div class="clear"></div>{% endif %}

    <div class="product {% if forloop.counter0|divisibleby:4 %}col{% else %}col20{% endif    %}">
        Lorem Ipsum is simply dummy text
    </div>

{% endfor %}
2
pkdkk

最も簡単な答えは、「jQueryをあきらめて使用すること」です。それが許容できる場合は、Djangoのテンプレートを非常に単純なものと戦うよりもおそらく簡単です。

1
Steve Losh

あきらめて使用 Jinja2テンプレートシステム

私はDjangoテンプレート言語をあきらめました。それはあなたがそれで何ができるかで非常に制限されています。Jinja2はDjangoテンプレートが使用するのと同じ構文を使用しますが、それ以上の多くの機能強化。

編集/注(私はそれが小さな問題の大きなスイッチのように聞こえることを知っていますが、実際には、常にデフォルトのテンプレートシステムと戦っていることに気づくでしょうDjangoでは、それは本当に価値があり、長期的にはあなたの生産性を高めると信じています。

あなたは読むことができます この記事は著者によって書かれました 、それは技術的ですが、彼はDjangoの{%cycle%}タグの問題に言及しています。

Jinjaにはサイクルタグがありません。ループにはサイクルメソッドがあります。

{% for user in users %}
    <li class="{{ loop.cycle('odd', 'even') }}">{{ user }}</li>
{% endfor %}

Jinja2の主な利点は、プレゼンテーションにロジックを使用できることです。そのため、画像のリストがあれば、N要素ごとにテーブル内に新しい行を開始できるため、それらをテーブルに配置できます。たとえば、次のことができます。

{% if loop.index is divisibleby(5) %}   
     </tr>
     {% if not loop.last %}
     <tr>
     {% endif %}
{% endif %}

数式を使用することもできます。

{% if x > 10 %}

python関数に直接アクセスできます(ただし、テンプレートに公開する関数を指定するには、いくつかの設定が必要です)

{% for item in normal_python_function_that_returns_a_query_or_a_list() %}

変数も設定します。

{% set variable_name = function_that_returns_an_object_or_something() %} 
1
hasen