web-dev-qa-db-ja.com

モジュラス%in Djangoテンプレート

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 %}

もちろん、%は予約文字であるため、これは機能しません。これを行う他の方法はありますか?

108
underdoeg

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 %}
191
Burhan Khalid

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' '' '' '' %}">
13
mipadi

サイクルタグを使用するだけのようです。 組み込みのテンプレートタグ

13

ブートストラップの行と列の例。 4アイテムごとに新しい行。また、アイテムが4つ未満の場合でも最後の行を閉じます。

myapp/templatetags/my_tags.py

from Django import template

register = template.Library()

@register.filter
def modulo(num, val):
    return num % val

htmlテンプレート

{% 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 %}
8
ab 16