2011-09-12 38 views
0

我已經切換到Django 1.3以獲得基於日期的通用視圖的分頁。這工作正常,但有一個頁面,我想要一個特定數量的項目,但不希望分頁。例如,返回前5個新聞條目。用基於類的基於日期的通用視圖替換num_latest?

在1.2我們有num_latest,我們可以把我們的信息字典,以獲得最新的項目。這似乎不存在與新的基於類的通用視圖。

我可以將paginate_by設置爲5,並且不使用模板中的分頁鏈接,但是人們仍然可以通過手動查看舊的條目(我不想)。此外,我不希望Django設置我不打算使用的分頁。

編輯:這是我目前使用的URL配置行:

url(r'^$', 
    ArchiveIndexView.as_view(
     model = Entry, 
     context_object_name = 'entry_list', 
     template_name = 'news/news.html', 
     date_field = 'published', 
    ), name = 'archive_index' 
), 

進一步編輯:試圖覆蓋get_dated_queryset我用這段代碼在如上URL配置結合但隨着新鑑於叫做:

class MainIndex(ArchiveIndexView): 
    def get_dated_queryset(self): 
     return Entry.objects.all()[:2] 

我得到幾乎相同的錯誤在評論中提到:一旦切片已採取 不能重新排序的查詢。

回答

3

嘗試重寫此相反:

 
def get_dated_items(self): 
    date_list, items, extra_context = super(MainIndex, self).get_dated_items() 
    return (date_list, items[:2], extra_context) 
注:此實現可能離開 date_list不符合 items查詢後切片後進行設置。我認爲要解決這個問題,您需要重新生成 date_list。有關更多詳細信息,請參閱SVN中BaseArchiveIndexView.get_dated_items的實現: http://code.djangoproject.com/browser/django/trunk/django/views/generic/dates.py。 像這樣的東西可能會工作:
 
def get_dated_items(self): 
    date_list, items, extra_context = super(MainIndex, self).get_dated_items() 
    items = items[:2] 
    date_list = self.get_date_list(items, 'year') 
    if not date_list: 
     items = items.none() 
    return (date_list, items, extra_context) 
但如果它沒有這個工作,我不會碰它,因爲它看起來太亂了。

+0

可悲的是沒有。我已經嘗試過簡單地對queryset進行切片,如下所示:queryset = Entry.objects.all()[:5],但是這給了我以下錯誤:「一旦切片已被採用,就無法過濾查詢。」,大概是因爲那裏是在切片之後完成的一些更多的東西。 –

+0

您是否使用BaseDayArchiveView mixin的派生? – akonsu

+0

不適用於該網址。我編輯了我的原始帖子,以顯示我目前用於相關視圖的urlconf。 –

0

我自己遇到了這個確切的問題。我發現使用ListView(而不是ArchiveIndexView)爲我節省了時間和麻煩。

爲了您的代碼第一塊,不同的是:

from django.views.generic import ListView 


url(r'^$', 
    ListView.as_view(
     model = Entry, 
     context_object_name = 'entry_list', 
     template_name = 'news/news.html', 
     queryset=Entry.objects.all().order_by("-published")[:2], 
    ), name = 'archive_index' 
), 
相關問題