3

我正在尝试 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_list作为object_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)
4

3 回答 3

4

一个新手错误。我没有make_object_list在课堂上指定。你可以在这个 commit看到它是如何被修复的。

文档中:

make_object_list

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

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

于 2011-04-20T18:46:22.757 回答
1

您已经解决了这个问题,但是要回答您关于为什么存在该选项的问题,文档说:

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

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

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

基于类的视图很难,值得仔细阅读文档,深入了解源代码(主要是django.views.generic)并熟悉调试技术,以逐步了解大多数视图中发生的稍微复杂的继承堆。

于 2012-04-16T16:54:57.183 回答
0

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

于 2011-05-04T00:02:54.207 回答