Django基于类的视图YearArchiveView

时间:2011-04-20 14:21:40

标签: django django-class-based-views

我正在尝试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)

3 个答案:

答案 0 :(得分:4)

新手的错误。我没有在课堂上指定make_object_list。您可以在this commit看到它是如何修复的。

来自documentation

  

make_object_list

     

一个布尔值,指定是否检索今年的完整对象列表并将其传递给模板。如果为True,则对象列表将可用于上下文。默认情况下,这是假的。

所以我不确定为什么存在这个选项,但确实如此。默认情况下不返回任何内容对我来说没有多大意义(也许是一个分页的东西?)

答案 1 :(得分:1)

您已经解决了这个问题,但要回答有关该选项存在的问题,the documentation说:

  

年度存档页面,显示特定年份的所有可用月份。

     

...模板的上下文将是:

     
      
  • date_list:一个DateQuerySet对象,包含根据查询集具有可用对象的所有月份,以升序显示为datetime.datetime对象。
  •   

基于类的视图很难,值得仔细阅读文档,潜入源代码(主要是django.views.generic)并熟悉debugging techniques来逐步完成稍微纠结的继承大多数观点。

答案 2 :(得分:0)

呀。我同意你的看法。我目前有自己的基于类的通用视图的实现工作,但我很好奇它是否“政治上正确”。无论如何,它是如何使用这个通用视图的,并且我认为这个(make_object_list)属性是编码器修补的可用选项。

相关问题