2009-09-17 108 views
1

我想在每4个元素后改变一个li的class属性(这意味着第5,第9,第13个li元素类应该被改变)。如何在django模板中使用数学余数?

我已经试过类似以下,但它给了我一个语法错误: 无法解析余:从“%4”,forloop.counter%4'

{% for p in plist %} 
{% ifequal forloop.counter%4 1 %} 
    <li class="clear"> {{p.title}} </li> 
{% else %} 
    <li> {{p.title}} </li> 
{% endifequal %} 
{% endfor %} 

,我将不胜感激,如果有人会建议我一个工作解决方案。

回答

5

你不能在django模板中做类似的评估。 ifequal标签只需要两个参数,并对它们进行比较。你需要一些类型的过滤器。

但是,您可以使用循环标签来代替:

{% for p in plist %} 
    {% if forloop.first %} 
     <li> {{p.title}} </li> 
    {% else %} 
     <li{% cycle '' '' '' ' class="clear"' %}> {{p.title}} </li> 
    {% endif %} 
{% endfor %} 

编辑:正如指出的那样,最初的解决方案扫清了4,8,等等,而不是从5日起实施。我已经更新了包含Tolga更改的答案。

+0

清除了第4,第8,第12 ...而不是第5,第9,第13。 – 2009-09-17 13:00:46

+0

我已经更改了您的建议解决方案,并根据需要进行工作。 {%在plist中%P} \t {%如果forloop.first%} \t \t

  • {{p.title}}
  • \t {%其他%} \t \t
  • {{p.title}}
  • \t {%ENDIF%} {%ENDFOR%} 这将清除5the第九等.. 由于为你们所有人提供宝贵的答案和意见。 – Tolga 2009-09-17 13:29:18

    +0

    谢谢Tolga,我已经更新了修改后的答案。 – 2009-09-18 07:04:55

    2

    逻辑会很复杂,但divisibleby过滤器可能会有所帮助。

    +0

    用的伎俩将是可行的,但是当你说出的复杂性会是这样的,它可能会更好把它移到了看法。添加一个简单的属性更具可读性,并且应该减少很多麻烦。 – Agos 2009-09-17 12:26:58

    +0

    我试过divisibleby,不幸的是它没有给出我需要的结果。有了divisibleby;我可以改变属性的第四,第八,而不是第五,第九.. – Tolga 2009-09-17 12:32:40

    +0

    所以你也可以使用'add'过滤器:'{%ifequal forloop.counter | add:“ - 1”| divisibleby:4%} “可怕,但是做你想做的。 – 2009-09-17 12:50:04

    1

    你不想这样做 - 这就是cycle的用途。

    {% for p in plist %} 
         <li{% ifnotequal forloop.counter 1 %}{% cycle ' class="clear"' '' '' '' %}{% endifnotequal %}>{{p.title}</li> 
    {% endfor %} 
    

    这个例子清除5,第9,第13等

    编辑:帽尖@cpharmston。

    +0

    {%ifnotequal forloop.counter 1%} {%cycle''''''class class =“clear”'%} {%endifnotequal%}? – 2009-09-17 12:53:07

    +0

    编辑,谢谢。 – 2009-09-17 12:59:36

    +0

    我刚刚看到您的编辑解决方案。我相信它也会提供相同的要求的结果。 – Tolga 2009-09-17 13:32:05

    7

    您可以使用forloop.counter0和过滤divisibleby:

    {% ifequal forloop.counter0|divisibleby:"4" %}