Djangoテンプレートの係数%


120

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

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


あなたもそれを試しましたか?Djangoは提供templatetagタグが、カバーすること{%%}(しない、など%)。
Platinum Azure

4
はい、試してみましたが、次のエラーが発生します。残りを解析できませんでした: '%'から '%'は、モジュラーの解析方法がわからないためと考えられます オペレータはまた、ドキュメントに記載されていないdocs.djangoproject.com/en/dev/ref/templates/builtins/...
underdoeg

回答:


210

組み込みのdjangoフィルターであるdivisiblebyが必要です。

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

1
ああ、そうです。今はサイクルを使用していますが、将来の参考にしてください。私はmodulor 100か何かでサイクルを使いたくありません:)実際、私はこの答えを正しいものとしてマークするのが目的です。回避策ではなくモジュレーターに焦点を当てているため...
underdoeg

15

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


12

ブートストラップの行と列の例。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 %}

2
これは、必要なディレクトリを作成する必要があること、およびカスタムテンプレートをテンプレートhtmlにロードする必要性を説明するため、より適切な回答です。ありがとうございました。
TruthAdjuster 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.