2011-04-20 128 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)属性是编码人员可以使用的一个可用选项。