djangoテンプレートで数学剰余を使用する方法は?
-
08-07-2019 - |
質問
4つの要素ごとにliのクラス属性を変更したい(つまり、5番目、9番目、13番目のli要素クラスを変更する必要がある)。
以下のようなことを試みましたが、構文エラーが発生しました: 残りを解析できませんでした: 'forloop.counter%4'からの '%4'
{% for p in plist %}
{% ifequal forloop.counter%4 1 %}
<li class="clear"> {{p.title}} </li>
{% else %}
<li> {{p.title}} </li>
{% endifequal %}
{% endfor %}
誰かが私に実用的な解決策を提案してくれれば幸いです。
解決
djangoテンプレートでは、このような評価を行うことはできません。 ifequalタグは2つのパラメーターのみを想定し、それらを比較します。何らかのタイプのフィルターが必要になります。
ただし、代わりにcycleタグを使用できます:
{% for p in plist %}
{% if forloop.first %}
<li> {{p.title}} </li>
{% else %}
<li{% cycle '' '' '' ' class="clear"' %}> {{p.title}} </li>
{% endif %}
{% endfor %}
編集:指摘したように、元のソリューションは5番目以降ではなく、4番目、8番目などをクリアしました。回答を更新して、Tolgaによる変更を含めました。
他のヒント
forloop.counter0とdivisiblebyを使用できます:
{% ifequal forloop.counter0|divisibleby:"4" %}
ロジックは複雑になりますが、 divisibleby フィルタが役立つ場合があります。
そのようにしたくない-それが cycle
は、対象です。
{% for p in plist %}
<li{% ifnotequal forloop.counter 1 %}{% cycle ' class="clear"' '' '' '' %}{% endifnotequal %}>{{p.title}</li>
{% endfor %}
この例では、5番目、9番目、13番目などをクリアします。
編集:hat tip @cpharmston。
これに少し苦労し、ブートストラップカードをカードデッキごとに3枚に制限しようとしました。
これはDjango 2.1以降で機能し、行を3つのグループに制限します。
{% ifequal forloop.counter|divisibleby:"3" True %}
所属していません StackOverflow