2013-12-18 21 views
2

我在這個模板:如何重置循環計數器?

{% for item in items %} 
    {% ifchanged item.st2 %} 
     <div class="clear"></div> 
     <div class="item-title">{{ item.get_st2 }}</div> 
    {% endifchanged %} 
    <div class="cell {% cycle 'clear tco1' 'tco' 'tco' 'tco2' 'clear tce1' 'tce' 'tce' 'tce2' %}">{{ item.name }}</div> 
{% endfor %} 

,它顯示了這樣的事情:

------------------ st2 name 1 ------------------- 

+-----------------------------------------------+ 
| grey item | grey item | grey item | grey item | 
+-----------------------------------------------+ 
| dark item | dark item | dark item | dark item | 
+-----------------------------------------------+ 
| grey item | grey item | grey item | grey item | 
+-----------------------------------------------+ 
| dark item | dark item | dark item | dark item | 
+-----------------------------------------------+ 
| grey item | grey item | grey item | grey item | 
+-----------------------------------------------+ 

------------------ st2 name 2 ------------------- 

+-----------------------------------------------+ 
| grey item | grey item | grey item | grey item | 
+-----------------------------------------------+ 
| dark item | dark item | dark item | dark item | 
+-----------------------------------------------+ 

其良好。

但如果ST2名的項目是4一行小於:

------------------ st2 name 1 ------------------- 

+-----------------------------------------------+ 
| grey item | grey item | grey item | grey item | 
+-----------------------------------------------+ 
| dark item | dark item | dark item | 
+-----------------------------------+ 

那麼未來看起來是這樣的:

------------------ st2 name 1 ------------------- 

+-----------------------------------+ 
| grey item | grey item | grey item | 
+-----------------------------------------------+ 
| dark item | dark item | dark item | dark item | 
+-----------------------------------------------+ 

因爲週期coutner仍然是第四個元素上。

如何重置週期標籤?

回答

1

您可以使用cycle標記與silent關鍵字來聲明循環但不產生第一個值。通過給循環標籤命名,使用"as",您可以在任何地方插入循環的當前值。具有變量名稱的另一個cycle標籤將獨立地將循環移動到下一個值。而divisibleby標籤可用於訂單項中檢查最後:

{% cycle 'clear tco1' 'tco' 'tco' 'tco2' 'clear tce1' 'tce' 'tce' 'tce2' as cellcls silent %} 
{% for item in items %} 
    {% ifchanged item.st2 %} 
     <div class="clear"></div> 
     <div class="item-title">{{ item.get_st2 }}</div> 
     {% if not forloop.counter1|divisibleby:"4" %} {# im not tested it #} 
      {% cycle cellcls %} 
     {% endif %} 
    {% endifchanged %} 
    <div class="cell {{cellcls}}">{{ item.name }}</div> 
    {% cycle cellcls %} 
{% endfor %} 
+0

不完全,但你幫了我,謝謝:) – Nips

0

醜陋,但它的工作原理:

{% cycle '1' '2' '3' '4' as cellcount silent %} 
{% cycle 'tco1' 'tco' 'tco' 'tco2' 'tce1' 'tce' 'tce' 'tce2' as cellcls silent %} 
{% for item in items %} 
    {% ifchanged item.st2 %} 
     {% if not forloop.first %} 
      {% if cellcount|add:0 == 2 %} 
       {% cycle cellcls %}{% cycle cellcls %}{% cycle cellcls %} 
       {% cycle cellcount %}{% cycle cellcount %}{% cycle cellcount %} 
      {% endif %} 
      {% if cellcount|add:0 == 3 %} 
       {% cycle cellcls %}{% cycle cellcls %} 
       {% cycle cellcount %}{% cycle cellcount %} 
      {% endif %} 
      {% if cellcount|add:0 == 4 %} 
       {% cycle cellcls %} 
       {% cycle cellcount %} 
      {% endif %} 
     {% endif %} 
     <div class="clear"></div> 
     <div class="item-title">{{ item.get_st2 }}</div> 
    {% endifchanged %} 
    <div class="cell {{ cellcls }}" style="{{ cellcount }}">{{ item.name }}</div> 
    {% cycle cellcls %} 
    {% cycle cellcount %} 
{% endfor %} 
0

我遇到同樣的問題來了,寫小自定義模板標籤(工作在Django 1.8 ):

from django import template 
import itertools 


register = template.Library() 


class ResetCycleNode(template.Node): 
    def __init__(self, variable_name, cycle_node): 
     self.variable_name = variable_name 
     self.cycle_node = cycle_node 

    def render(self, context): 
     cycle_iter = itertools.cycle(self.cycle_node.cyclevars) 
     context.render_context[self.cycle_node] = cycle_iter 
     context[self.variable_name] = next(cycle_iter).resolve(context) 
     return '' 


@register.tag 
def reset_cycle(parser, token, escape=False): 
    args = token.split_contents() 

    if len(args) != 2: 
     raise TemplateSyntaxError("'reset_cycle' tag requires exactly one argument") 

    name = args[1] 
    if not hasattr(parser, '_namedCycleNodes'): 
     raise TemplateSyntaxError("No named cycles in template. '%s' is not defined" % name) 
    if name not in parser._namedCycleNodes: 
     raise TemplateSyntaxError("Named cycle '%s' does not exist" % name) 

    return ResetCycleNode(name, parser._namedCycleNodes[name]) 

,然後用它的模板是這樣的:

{% cycle 'clear tco1' 'tco' 'tco' 'tco2' 'clear tce1' 'tce' 'tce' 'tce2' as cellclass silent %} 
{% for item in items %} 
    {% ifchanged item.st2 %} 
     <div class="clear"></div> 
     <div class="item-title">{{ item.get_st2 }}</div> 
     {% reset_cycle cellclass %} 
    {% endifchanged %} 
    <div class="cell {{ cellclass }}{% cycle cellclass %}">{{ item.name }}</div> 
{% endfor %}