使用ifchanged

时间:2012-11-19 10:03:03

标签: python django

  

可能重复:
  Python-Django: ifchanged template tag

这是我现在的代码:

{% for eachSc in DBShots1 %}
 <tr>
    {% ifchanged eachSc.laEmpNum %} 

      <td> </td><td> </td>                                  
      <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 }} - {{ eachSc.laEmpNum }}</td>

{% endfor %}

从上面的代码中显示如下:

 Tot=[(u'1046', 5.5), (u'8008', 4.5), (u'8011', 1.3)]

1 ------- 01 ------ 2.5 ------------- 60 ------ allLayout - 1046

2 ------- 02 ------ 2.0 ------------- 48 ------ allLayout - 1046

3 ------- 04 ------ 1.0 -------------- 0 ------ allLayout - 1046

 Tot=[(u'1046', 5.5), (u'8008', 4.5), (u'8011', 1.3)]

4 ------- 03 ------ 2.3 ------------- 50 ------ allLayout - 8008

5 ------- 06 ------ 2.2 ------------- 0 ------- allLayout - 8008

 Tot=[(u'1046', 5.5), (u'8008', 4.5), (u'8011', 1.3)]

6 ------- 05 ------ 1.3 ------------- 0 ------- allLayout - 8011

但是我的输出应该如下所示: 如果empID改变(1046,8008,8011)那么 {{forloop.counter}}应以一(1)开头,{{result}}应显示第一个元素((1046,5.5)作为第一个ID(1046) 第二个(8008',4.5)元素用于第二个ID(8008),依此类推:

1 ------- 01 ------ 2.5 ------------- 60 ------ allLayout - 1046

2 ------- 02 ------ 2.0 ------------- 48 ------ allLayout - 1046

3 ------- 04 ------ 1.0 ------------- 0 ------- allLayout - 1046

     Tot=(1046,5.5) 

1 ------- 03 ------ 2.3 ------------- 50 ------ allLayout - 8008

2 ------- 06 ------ 2.2 ------------- 0 ------- allLayout - 8008

    Tot=(8008', 4.5)

1 ------- 05 ------ 1.3 ------------- 0 ------- allLayout - 8011

    Tot=(8011', 1.3)

2 个答案:

答案 0 :(得分:1)

你有2个问题:

  1. 仅显示特定的empID,而不是全部来自字符串:

    Ans :您无法执行此操作,因为您无法将变量用于属性名称,字典键或列表显示,这样您就无法在计数器中仅显示数组中的特定索引。在将该值显示在模板上或创建自定义模板标记之前,您可能需要将此值放入列表DBShots1。

  2. 每次更改empID时重置计数器:

    Ans :您可以使用重新组合功能对列表进行排序,这将为每个empID创建另一个for循环 https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#regroup

  3. e.g。

    {% regroup DBShots1 by eachSc.laEmpNum as emp_list %}
    {% for eachSc in emp_list %}
            <tr>
                <td> </td><td> </td> 
                <td bgcolor="#FFFACD" width="1%">EmpNum : {{ eachSc.grouper }}</td>
            </tr>
            {% for item in eachSc.list %}
                <td bgcolor="#FFFACD" width="1%">{{ forloop.counter }} </td> 
                <td bgcolor="#CCFACD" width="1%">{{ item.sName }} </td>
                <td bgcolor="#CCF0F5" width="1%">{{ item.duration }}</td>
                <td bgcolor="#CCFACD" width="1%">{{ item.frames }}</td>
                <td bgcolor="#CCFACD" width="5%">{{ GetEmpDept }} - {{ item.laEmpNum }}</td>
            {% endfor %}
    {% endfor %}
    

答案 1 :(得分:0)

这里你不需要使用ifchanged。

您应该使用resultforloop.counter0编入索引,但django模板系统无法为其编制索引。

您可以编写自定义标记来执行此操作,也可以更改视图,将结果添加到对象上下文中。