2011-12-13 9 views
86

私はdjangoのモジュラス演算子のようなものを使う方法を探しています。私がやろうとしているのは、ループ内の4番目の要素すべてにクラス名を追加することです。Djangoテンプレートのモジュラス%

モジュラスで、それは次のようになります。%は予約文字であるため

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

はもちろん、これは動作しません。これを行うための他の方法はありますか?

+0

あなたもそれを試してみましたか? Djangoは 'templatetag'タグを提供しますが、' {% '、'%} 'など('% 'ではなく)をカバーします。 –

+4

はい、試しましたが、次のエラーが表示されます。残りを解析できませんでした: '%' from '%' モジュラーをパージする方法がわからないためです。演算子もドキュメントに記載されていませんhttps://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#operator – underdoeg

答えて

162

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

+1。 'divisibleby'を忘れてしまった場合、これも素晴らしい選択肢になります。 – mipadi

+0

ああ、それはまさにそれです。今サイクルを使用していますが、将来の参照には適しています。私はモジュラス100または何かを使ってサイクルを使用したくないでしょう:)実際、私はこの答えを正しいものとしてマークするように努力しています。回避策ではないモジュラーに焦点を当てているためです... – underdoeg

11

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

ですね。

+0

質問は私が探していたものですが、この答えは何が働いていた本当にうまい。ありがとうございました! – Brendan

3

ブートストラップの行と列の例。 新しい行は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でもカスタムテンプレートをロードする必要があることを説明しているため、より良い答えです。ありがとうございました。 – ifelsemonkey