Skip to main content
 首页 » 编程设计

Python-Django : ifchanged template tag

2025年05月04日21over140

我在这里从数据库中获取具有持续时间的员工。具有 2 或 3 条记录的同一员工。 所以获取员工持续时间并添加和显示,如果员工 ID 发生变化 再次计算员工持续时间并显示 我需要通过{{ forloop.counter }}分别找到每个员工ID有多少条记录

我的问题是...

  1. 如果我的循环进入 {% ifchanged eachSc.laEmpNum %},则 {{ result.0 }}。如果再次出现 {{ result.1 }} 和 {{ result.2 }} 则依此类推...

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

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

请您参考如下方法:

我认为这里有几个问题需要处理。首先,我看到您想根据 forloop 计数器的位置打印“结果”变量的一项。这在 django 模板中是不可能的(出于各种公平的原因)。要在不重新组织 View 中的数据的情况下快速解决此问题,您可以定义一个自定义过滤器,它只返回指定索引上的列表项。你可以把它放在你的 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”分组器的迭代检索结果项。