Python-Django:ifchanged模板标签

时间:2012-11-17 12:21:57

标签: python django

在这里,我从具有2或3条记录的database.Same员工那里获得持续时间的员工。 因此,如果员工ID发生变化,请加上员工持续时间并添加和显示 再次计算员工持续时间和显示 我需要通过{{ forloop.counter }}单独

找到每个员工ID有多少条记录

我的问题在于......

  1. 如果我的循环进入{% ifchanged eachSc.laEmpNum %},那么{{ result.0 }}。如果再次{{ result.1 }}{{ result.2 }},那么......

  2. 如果我的循环进入{% ifchanged eachSc.laEmpNum %},那么我的{{ forloop.counter }}应该再次从0(零)开始。

  3. result = [5.5, 4.5, 1.3]我来自view.py

    {% for eachSc in DBShots1 %}
    
    <tr>
        {% ifchanged eachSc.laEmpNum %} 
    
        <td bgcolor="#FFFACD" width="1%">Tot={{ result }}</td>
        {% endifchanged %}
    
    </tr>
        <td bgcolor="#FFFACD" width="1%">{{ forloop.counter }} </td> 
    
        <td bgcolor="#CCFACD" width="1%">{{ eachSc.sName }}</td>
    
        <td bgcolor="#CCF0F5" width="1%">{{ eachSc.duration }}</td>
    
        <td bgcolor="#CCFACD" width="1%">{{ eachSc.frames }}</td>
    
        <td bgcolor="#CCFACD" width="5%">{{ GetEmpDept }} - {{ getEmpName.emp_name }} - {{ eachSc.laEmpNum }}</td>
    {% endfor %}
    

1 个答案:

答案 0 :(得分:1)

我相信这里有几个问题要处理。首先,我看到你要打印'result'变量的项目,具体取决于forloop计数器的位置。这在django模板中是不可能的(出于各种公平原因)。要在不重新组织视图中的数据的情况下快速解决此问题,您可以定义一个自定义过滤器,它只返回指定索引上的列表项。您可以将它放在templatetags / myfilters.py中:

from django import template
register = template.Library()

@register.filter
def getitem(mylist, index):
    return mylist[index]

然后,要在'laEmpNum'更改时重置forloop计数器,您应该使用'regroup'django模板标记,如下所示:

{% load myfilters %}
{% regroup DBShots1 by laEmpNum as eachScList %}
{% for eachScGrp in eachScList %}
    {% for eachSc in eachScGrp.list %}
    <tr>
      <td bgcolor="#FFFACD" width="1%">{{ forloop.counter }} </td> 
      <td bgcolor="#CCFACD" width="1%">{{ eachSc.sName }}</td>
      <td bgcolor="#CCF0F5" width="1%">{{ eachSc.duration }}</td>
      <td bgcolor="#CCFACD" width="1%">{{ eachSc.frames }}</td>
      <td bgcolor="#CCFACD" width="5%">{{ GetEmpDept }} - {{ getEmpName.emp_name }} - {{ eachSc.laEmpNum }}</td>
     </tr>
    {% endfor %}
    <tr>
        <td> </td><td> </td>
        <td bgcolor="#FFFACD" width="1%">Tot={{ result|getitem:forloop.counter0 }}</td>
    </tr>
{% endfor %}

第一行加载我们的自定义过滤器库。最后一部分使用自定义过滤器根据'laEmpNum'分组器上的迭代检索结果项。