Django - 在模板中按某字段分组查询集

13 投票
1 回答
8226 浏览
提问于 2025-04-17 09:15

我有一个名为 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。)

撰写回答