Django - группировка наборов запросов по определенному полю в шаблоне - PullRequest
5 голосов
/ 30 декабря 2011

У меня есть таблица Events, упорядоченная по полю date.

Я хочу распечатать события в шаблоне, но с использованием отдельного div для каждой даты, например ::

<div class="content">
  <h1>December 30th</h1>
  <!-- div for Event 1 from December 30th -->
  <!-- div for Event 2 from December 30th -->
</div>

<div class="content">
  <h1>December 31st</h1>
  <!-- div for Event 1 from December 31st -->
  <!-- div for Event 2 from December 31st -->
  <!-- div for Event 3 from December 31st -->
</div>

Как мне это сделать?


Мое текущее решение - поместить объекты Event в словарь с ключом в качестве даты. Это имеет проблемы с порядком, не элегантно и неэффективно.

Вид:

events = Event.objects.select_related().all()

events_dict={}
for event in events:
    date=event.date.strftime('%d %B %Y')
    if date in events_dict:
        events_dict[date].append(event) 
    else:
        events_dict[date] = [event]

Шаблон:

{% for date, events in events_dict.items %}
  <div class="content">
    <h1>{{date}}</h1>
    {% for event in events %}
      {% include "partials/event.html" %}
    {% endfor %}
  </div>
{% endfor %}

1 Ответ

11 голосов
/ 30 декабря 2011

Вы ищете тег {% regroup %}, который делает именно то, что вы хотите.Он принимает последовательность элементов (она должна быть предварительно заказана, которая у вас есть) и поиск и группирует последовательность по этому поиску.

view:

events = Event.objects.select_related.all()

template:

{% regroup events by date as events_by_date %}
{% for date in events_by_date %}
    <div class="content">
    <h1>{{ date.grouper|date:"d F Y" }}</h1>
    {% for event in date.list %}
        {% include "partials/event.html" %}
    {% endfor %}
    </div>
{% endfor %}

(Обратите внимание, что строка формата даты отличается; эквивалент %B в strftime равен F для date фильтра ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...