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

2024-06-17 17:59:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有必要计算一支运动队的排名,根据他们所属部门的总分。在

每个队都有一个总分和分配给他们的分区。在

在视图.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模板代码如下:

在调味品.html在

^{pr2}$

现在的问题是,假设我有6支球队,3支在甲级,3支在乙级

因为它是按部门划分的,所以它展示了forloop.计数器在第一个forloop上为1到6。我希望它只对嵌套的forloop执行forloop计数器(第二个用于stats),以便它显示分区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语句导致了这样一个问题:如果除法不匹配,它将跳过一个记录。我想不出办法让它按顺序数数。在


Tags: namestatsplaceteampointsdivision分区player
2条回答

即使您有一个if语句来确保不会显示来自其他分区的统计信息,但是即使stat.division == division返回{},for循环计数器仍然会增加。在

考虑在Python中计算出位置,并在模板中使用它,而不是尝试在模板中计算出来。 这里有一个可能的解决方案。在

Python(假设您已经对stats集进行了排序):

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

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

模板:

^{pr2}$

最干净的方法是:

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

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

相关问题 更多 >