2013-12-18 20 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 %}