2011-04-20 86 views
2

我嘗試了Django的基於類的視圖,並喜歡它們到目前爲止,但我無法讓YearArchiveView給我任何東西。這裏是我的類:Django基於類的視圖YearArchiveView

class ThoughtsByYearView(YearArchiveView): 
    template_name = "thoughts/index_by_year.html" 
    queryset = Thought.objects.published() 
    date_field = 'pub_date' 
    context_object_name = 'thought_list' 

和我的urls.py:

urlpatterns = patterns('thoughts.views', 
    url(r'^$', ThoughtsIndexView.as_view(), name='thoughts'), 
    url(r'^(?P<year>\d{4})/$', ThoughtsByYearView.as_view(), name='thoughts_year'), 
) 

兩個thought_listobject_list回報空列表。重新定義get_queryset也不會導致任何結果。 ThoughtsIndexView返回正確的對象,所以我相信這只是我犯的一個愚蠢的錯誤。誰能告訴我它是什麼?

哦,這裏是失敗的測試用例:(編輯:結果在瀏覽器中是一樣的無回報)

def test_thoughts_by_year_has_thoughts(self): 
    response = self.client.get(reverse('thoughts_year', args=[datetime.now().year])) 
    thoughts_by_year = response.context_data['thought_list'] 
    self.assertGreater(len(thoughts_by_year), 0) 
+0

這是正確的:'Thought.objects.published()'? – DTing 2011-04-20 18:37:56

+0

是的,這是正確的。 – 2011-04-20 18:40:21

回答

1

你已經解決了這個問題,但回答你關於爲什麼選擇存在問題,the documentation說:

顯示在一年中所有可用的幾個月每年的存檔頁。

...模板的背景是:

  • date_list:包含根據查詢集有可用對象的所有月份,表示爲datetime.datetime對象,按升序對DateQuerySet對象。

基於類的觀點則很難,這是值得非常仔細地閱讀文檔,潛入源(主要是django.views.generic),並與debugging techniques越來越熟悉的步驟通過繼承的稍微糾結樁最回事觀點。

4

一個新手的錯誤。我沒有在課堂上指定make_object_list。你可以看到它是如何修復在this commit

documentation

make_object_list

一個布爾值,指定是否檢索對象的完整列表,今年和這些信息傳遞給模板。如果爲True,對象列表將可用於上下文。默認情況下,這是False。

所以我不知道爲什麼這個選項存在,但它確實存在。對我來說沒有什麼意義,默認情況下不返回任何東西(可能是分頁的東西?)

0

是的。我贊同你。我目前有自己的這個基於類的泛型視圖的實現,但我很好奇它是否「在政治上是正確的」。無論如何,這是一個關於如何使用這個通用視圖的板子,我認爲這個(make_object_list)屬性是編碼人員可以使用的一個可用選項。