我想要做这样的事情:上市博客文章,一个月
Entries.objects.values('date.year','date.month')
,但此行是无效的。如何按年份,月份列出博客条目并将其显示在模板中?
谢谢!
我想要做这样的事情:上市博客文章,一个月
Entries.objects.values('date.year','date.month')
,但此行是无效的。如何按年份,月份列出博客条目并将其显示在模板中?
谢谢!
如果您在您的视图设置
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的queryset方法博客档案是dates。
例如
entry_months = Entry.objects.dates('pub_date','month','DESC')
返回datetime.datetime
的DateQuerySet
一个对象为具有博客条目每个月。您可以在模板中使用此查询集来创建每月归档页面的链接。
下面是一些代码从我的博客剪断,我列出所有的博客条目的某一年之内:
Entries.objects.filter(draft=drafts).filter(posted_date__year=year).order_by(order_by)
在上面:
drafts
是一个布尔值,指定是否显示完成的项目与否。year
是所选年份order_by
是一些排序列名称。你应该可以很容易地修改这个例子来包含月份。以上显示您可以在一行中组合多个过滤器。
您可以尝试使用内置的重新分组标记。
在你看来:
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 %}
好吧,让我们尝试代替模板做数据结构繁重。
让我们来创建一个实用程序。
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]}}
,你可以在模板
很好地显示