使用嵌套for循环时,forloop.counter数字不会重置

时间:2018-01-14 15:23:26

标签: python django for-loop django-templates

我需要根据他们所在部门的总分来计算运动队的排名。

每个团队都有总分和分配。

views.py

def seasonstandings(request):
    divisions = Team.objects.order_by().values_list('division__name',flat=True).distinct()
    stats = WeeklyStats.objects.values('player__team__team_name').annotate(
        team=F('player__team__team_name'),
        points = Sum('finishes'),
        division = F('player__team__division__name')
    ).order_by('division','-points')

    return render(request, 'website/seasonstandings.html', {
        'divisions_and_stats': [[division, [stat for stat in stats if stat.division == division]] for division in divisions]
    })

我的Django模板代码如下:

seasonstandings.html

      {% for division in divisions %}
      <h4>{{ division }}</h4>
      <table class="table">
        <tr>
          <td align="center">Place</td>
          <td>Team</td>
          <td align="center">Points</td>
        </tr>
        {% for stat in stats %}
          {% if stat.division == division %}
          <tr>
              <td width="10%" align="center">{{ forloop.counter}}</td>
              <td width="70%">{{ stat.team }}</td>
              <td width="20%" align="center">{{ stat.points }}</td>
          </tr>
          {% endif %}
        {% endfor %}
        </table>
      {% endfor %}

现在的问题是,我说有6个队,3个在A区,3个在B区。

因为它是根据分区将团队分开,所以在第一个forloop分区上显示forloop.counter为1到6。我想要它只做嵌套forloop的forloop计数器(统计数据的第二个),以便它显示分区A的1到3和分区B的1到3。

我得到的结果是:

Division A
Place   Team                        Points
1       Timberlea Beverage Room 1   7
3       Lakeside Legion 1           4
4       Bedford Legion              3

Division B
Place   Team                        Points
2       Lakeside Legion 2           4
5       Purcells Cove Club 1        2
6       Army Navy Air-Force Club    None

当我希望得到的结果如下:

Division A
Place   Team                        Points
1       Timberlea Beverage Room 1   7
2       Lakeside Legion 1           4
3       Bedford Legion              3

Division B
Place   Team                        Points
1       Lakeside Legion 2           4
2       Purcells Cove Club 1        2
3       Army Navy Air-Force Club    None

在进一步研究之后,我认为这是我的IF声明导致问题,如果该部门不匹配,它将跳过记录。我无法想办法让它按顺序计算数字。

2 个答案:

答案 0 :(得分:1)

即使你有一个if语句来确保不显示来自其他分区的统计数据,即使stat.division == division返回False,for循环计数器仍会递增。

考虑使用Python中的位置,并在模板中使用它,而不是尝试在模板中进行处理。 这是一个可能的解决方案。

Python(假设您已对之前设置的统计信息进行了排序):

context = {
    # ...
    'divisions_and_stats': [[division, [stat for stat in stats if stat['division'] == division]] for division in divisions]
    # ...
}

根据您的偏好/需要,您可以使用stat.get('division', None),这样就不会遇到任何KeyError例外情况。

模板:

{% for division, stats in divisions_and_stats %}
<h4>{{ division }}</h4>
<table class="table">
    <tr>
        <td align="center">Place</td>
        <td>Team</td>
        <td align="center">Points</td>
    </tr>
    {% for stat in stats %}
    <tr>
        <td width="10%" align="center">{{ forloop.counter }}</td>
        <td width="70%">{{ stat.team }}</td>
        <td width="20%" align="center">{{ stat.points }}</td>
    </tr>
    {% endfor %}
</table>
{% endfor %}

答案 1 :(得分:-1)

也许最干净的方法是通过JavaScript:

{% for division in divisions %}
 <script> var counter = 0 </script>
 {% for stat in stats %}
  {% if stat.division == division %}<tr>
   <td id="{{forloop.counter}}" width="10%" align="center">{{ forloop.counter}}</td>
   <script> var counter = counter + 1
    var s{{forloop.counter}} = counter
    document.getElementById("{{forloop.counter}}").innerHTML = s{{forloop.counter}};
   </script>
   <td width="20%" align="center">{{ stat.points }}</td>
  </tr>
  {% endif %}
 {% endfor %}
{% endfor %}

我没有机会测试代码。然而,即使它有错误,它也是一个良好的开端。

相关问题