Django - 通过模板中的某个字段对查询进行分组 [英] Django - Grouping querysets by a certain field in template

查看:806
本文介绍了Django - 通过模板中的某个字段对查询进行分组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个表事件,按字段日期



我想打印出模板中的事件,但是为每个日期使用单独的div,例如:

 < div class =content> 
< h1> 12月30日< / h1>
<! - div为12月30日的事件1>
<! - div为12月30日的事件2 - >
< / div>

< div class =content>
< h1> 12月31日< / h1>
<! - div为12月31日的事件1>
<! - div为12月31日的活动2>
<! - div为12月31日的事件3>
< / div>

我该怎么做?






我目前的解决方案是将事件对象放在字典中,并将日期作为关键字。这有订购问题,并且效率低下。



查看:

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

events_dict = {}
事件中的事件:
date = event.date.strftime('%d %B%Y')
如果date_dict中的日期:
events_dict [date] .append(event)
else:
events_dict [date] = [event]

模板:

  {%for date,events_dict.items%}中的事件
< div class =content>
< h1> {{date}}< / h1>
{%活动中的事件%}
{%includepartials / event.html%}
{%endfor%}
< / div>
{%endfor%}


解决方案

重新查找 {%重组%} 标签,这完全符合您的要求。它需要一系列的项目(它必须事先订购,您的是),并通过查找进行查找并对序列进行分组。



查看:

  events = Event.objects.select_related.all()

模板:

  {%将事件按日期重新排列为events_by_date%} 
{%for events in date_by_date%}
< div class =content>
< h1> {{date.grouper | date:d F Y}}< / h1>
{%for date in date.list%}
{%includepartials / event.html%}
{%endfor%}
< / div>
{%endfor%}

(请注意,日期格式字符串不同; 相当于%B strftime 日期过滤器 F p>

I have a table Events, ordered by a field date.

I want to print out the events in the template, but using a separate div for each date, e.g.:

<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>

How do I do this?


My current solution is to put the Event objects in a dictionary with the date as the key. This has ordering issues and is inelegant and inefficient.

View:

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]

Template:

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

解决方案

You're looking for the {% regroup %} tag, which does exactly what you want. It takes a sequence of items (it has to be ordered beforehand, which yours is) and a lookup and groups the sequence by that lookup.

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

(Notice that the date format string is different; the equivalent of %B in strftime is F for the date filter).

这篇关于Django - 通过模板中的某个字段对查询进行分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆