按年,月列出博客条目

时间:2009-11-21 00:14:43

标签: python django date

我想做这样的事情:

Entries.objects.values('date.year','date.month')

但此行无效。如何按年,月列出博客条目并将其显示在模板中?

谢谢!

4 个答案:

答案 0 :(得分:9)

如果您设置

entry_list = Entry.objects.order_by('pub_date')

在您的视图中,您可以使用ifchanged模板标记在模板中显示月份和年份。

{% for entry in entry_list %}
{% ifchanged %}<h3>{{entry.pub_date|date:"Y"}}</h3>{% endifchanged %}
{% ifchanged %}<h4>{{entry.pub_date|date:"F"}}</h4>{% endifchanged %}
<p>{{entry.title}}</p>
{% endfor %}

博客档案的另一个有用的Django查询集方法是dates

例如

entry_months = Entry.objects.dates('pub_date','month','DESC')

每月返回DateQuerySetdatetime.datetime个具有博客条目的对象。您可以在模板中使用此查询集来创建指向每月存档页面的链接。

答案 1 :(得分:4)

您可以尝试使用内置的重组标记。

在您看来:

archives = Entries.objects.all()

在你的模板中:

{% regroup archives by date.month as entries_by_month %}
{% for entries in entries_by_month %}
    <h1>{{ entries.list.0.date|date:"F Y" }}</h1>
    <ul>
    {% for entry in entries.list %}
        <li>{{ entry.title }}</li>
    {% endfor %}
    </ul>
{% endfor %}

答案 2 :(得分:1)

以下是从我的博客中剪切的一些代码,其中列出了特定年份内的所有博客条目:

Entries.objects.filter(draft=drafts).filter(posted_date__year=year).order_by(order_by)

在上面:

  • drafts是一个布尔值,指定是否显示已完成的项目。
  • year是选定的年份
  • order_by是一些订购列名称。

您应该能够轻松修改此示例以包含月份。 以上显示您可以连续组合多个过滤器。

答案 3 :(得分:0)

好的,让我们尝试在数据结构中进行繁重的工作,而不是模板。

让我们创建一个实用程序。

import itertools

def group_by_values(posts, key):
    groups = {}
    for k, g in itertools.groupby(posts, key):
        if groups.get(k) is not None:
           groups[k].extend(list(g))
        else:
            groups[k] = list(g)
    return groups

我们在这里使用这个实用程序。

entries = Entry.objects.all().order_by('date')
yearly_entries = group_by_values(entries, key=lambda x: x.date.year)
monthly_yearly_entries = {}
for k, v in yearly_entries.items():
    monthly_yearly_entries[k] = group_by_values(v, key=lambda x: x.date.month)
return monthly_yearly_entries

结果是很好的字典,有几年和几个月像这样的键:

monthly_yearly_entries = {2013: {9: [Entry1, Entry2], 10: [Entry4, Entry5]}}

你可以在模板中很好地展示