2011-12-13 119 views
86

我正在尋找一種方法來使用類似django中的模量運算符。我想要做的是給循環中的每個第四個元素添加一個類名。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`標籤,但是覆蓋`{%`,`%}`等等(不是````)。 – 2011-12-13 18:28:02

+4

是的,我試過了,但我得到了以下錯誤:無法解析餘數:'%'來自'%' 我認爲這是因爲它不知道如何削減模數。運營商也沒有在文檔上列出https://docs.djangoproject.com/zh/dev/ref/templates/builtins/?from=olddocs#operator – underdoeg 2011-12-13 18:31:00

回答

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 2011-12-13 18:47:47

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