Djangoのモジュラス演算子のようなものを使用する方法を探しています。私がやろうとしているのは、ループ内の4番目ごとの要素にクラス名を追加することです。
モジュラスを使用すると、次のようになります。
{% for p in posts %}
<div class="post width1 height2 column {% if forloop.counter0 % 4 == 0 %}first{% endif %}}">
<div class="preview">
</div>
<div class="overlay">
</div>
<h2>p.title</h2>
</div>
{% endfor %}
もちろん、%は予約文字であるため、これは機能しません。これを行う他の方法はありますか?
divisibleby 、組み込みDjango=フィルター。
{% for p in posts %}
<div class="post width1 height2 column {% if forloop.counter0|divisibleby:4 %}first{% endif %}">
<div class="preview">
</div>
<div class="overlay">
</div>
<h2>p.title</h2>
</div>
{% endfor %}
Djangoテンプレートタグでモジュラス演算子を使用することはできませんが、そうするためのフィルターを作成することは簡単です。このような何かが動作するはずです:
@register.filter
def modulo(num, val):
return num % val
その後:
{% ifequal forloop.counter0|modulo:4 0 %}
代わりに、次のようなこともできます。
@register.filter
def modulo(num, val):
return num % val == 0
その後:
{% if forloop.counter0|modulo:4 %}
または、cycle
タグを使用できます。
<div class="post width1 height2 column {% cycle 'first' '' '' '' %}">
サイクルタグを使用するだけのようです。 組み込みのテンプレートタグ
ブートストラップの行と列の例。 4アイテムごとに新しい行。また、アイテムが4つ未満の場合でも最後の行を閉じます。
from Django import template
register = template.Library()
@register.filter
def modulo(num, val):
return num % val
{% load my_tags %}
{% for item in all_items %}
{% if forloop.counter|modulo:4 == 1 %}
<div class="row">
{% endif %}
<div class="col-sm-3">
{{ item }}
</div>
{% if forloop.last or forloop.counter|modulo:4 == 0 %}
</div>
{% endif %}
{% endfor %}