2011-12-30 3 views
3

У меня есть таблица Events, упорядоченная по полю date.Django - Группировка запросов по определенному полю в шаблоне

Я хочу, чтобы распечатать события в шаблоне, но с помощью отдельного 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 %} 
+2

Вы пробовали [перегруппировать] (https://docs.djangoproject.com/en/1.3/ref/templates/builtins/#regroup) тег? – demalexx

+0

@ race1 Нет, я этого не делал, и это то, что я искал. Спасибо. Если вы опубликуете ответ, я приму его – bcoughlan

+0

спасибо, но есть еще один хороший ответ, примите его :) – demalexx

ответ

8

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

вид:

events = Event.objects.select_related.all() 

шаблона:

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

(Обратите внимание, что строка формата даты отличается; the equivalent of %B in strftime is F for the date filter).