我需要根据他们所在部门的总分来计算运动队的排名。
每个团队都有总分和分配。
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声明导致问题,如果该部门不匹配,它将跳过记录。我无法想办法让它按顺序计算数字。
答案 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 %}
我没有机会测试代码。然而,即使它有错误,它也是一个良好的开端。