Нумерованный список с некоторыми равными позициями в шаблоне Django?

#django #django-templates

#django #django-шаблоны

Вопрос:

В моем шаблоне Django у меня есть диаграмма, построенная из набора запросов, упорядоченная по убыванию score , что-то вроде этого (без каких-либо тегов HTML):

 {% for player in players %}
    {{ forloop.counter }}. {{ player.name }} ({{ player.score }})
{% endfor %}
  

Однако, если у соседних игроков одинаковые оценки, я хочу, чтобы их позиции были одинаковыми, т.Е.:

 1.  Bob    (100)
2=. Thelma  (95)
2=. Terry   (95)
4.  Audrey  (90)
  

Правильно ли я понимаю, что нет способа сделать это, используя стандартные теги шаблонов Django (я не использую Jinja)? Было бы лучшим способом перебрать набор запросов в представлении (или откуда бы он ни исходил) и вычислить эти позиции там, добавив их к каждому элементу, прежде чем они попадут в шаблон?

Ответ №1:

это больше похоже на то, что нужно обрабатывать в представлении:

 players = your_queryset
ordered_players = []
counter = 1
previous_player = PlayerModel.objects.none()
for player in players.order_by("score"):
  if player.score == previous_player.score:
    position = previous_player.position
  else:
    position = counter
  ordered_players.append({
    "position": position, 
    "name": player.name,
    "score": player.score
  })
  previous_player = player
  counter  = 1
return render(request, "template.html", {"players": ordered_players})
  

шаблон:

 {% for player in players %}
    {{ player.position }}. {{ player.name }} ({{ player.score }})
{% endfor %}
  

Комментарии:

1. Спасибо, я боялся, что это может быть так, просто подумал, что проверю. Иногда мне нравится простота шаблонов Django, иногда я хочу немного больше сложности!

2. КСТАТИ, @Brian, опечатка в строке 4 — должна быть previous_player .