2009-11-21 99 views
1

我想要做這樣的事情:上市博客文章,一個月

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

,但此行是無效的。如何按年份,月份列出博客條目並將其顯示在模板中?

謝謝!

回答

8

如果您在您的視圖設置

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.datetimeDateQuerySet一個對象爲具有博客條目每個月。您可以在模板中使用此查詢集來創建每月歸檔頁面的鏈接。

1

下面是一些代碼從我的博客剪斷,我列出所有的博客條目的某一年之內:

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

在上面:

  • drafts是一個布爾值,指定是否顯示完成的項目與否。
  • year是所選年份
  • order_by是一些排序列名稱。

你應該可以很容易地修改這個例子來包含月份。以上顯示您可以在一行中組合多個過濾器。

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

,你可以在模板

很好地顯示