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>
我该怎么做呢?
我现在的做法是把事件对象放在一个字典里,用日期作为键。这样做有排序的问题,而且看起来不太优雅,也不够高效。
视图:
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 个回答
26
你需要的是{% 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 %}
(注意日期格式字符串是不同的;在strftime
中%B
的对应在date
过滤器中是F
。)