Django-按模板中的特定字段对查询集进行分组
问题内容:
我有一张桌子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 %}
问题答案:
您正在寻找的{% 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 %}
(请注意,该日期格式字符串是不同的;相当于%B
在strftime
是F
针对date
过滤器)。