我正在尝试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)
答案 0 :(得分:4)
是新手的错误。我没有在课堂上指定make_object_list
。您可以在this commit看到它是如何修复的。
make_object_list
一个布尔值,指定是否检索今年的完整对象列表并将其传递给模板。如果为True,则对象列表将可用于上下文。默认情况下,这是假的。
所以我不确定为什么存在这个选项,但确实如此。默认情况下不返回任何内容对我来说没有多大意义(也许是一个分页的东西?)
答案 1 :(得分:1)
您已经解决了这个问题,但要回答有关该选项存在的问题,the documentation说:
年度存档页面,显示特定年份的所有可用月份。
...模板的上下文将是:
- date_list:一个DateQuerySet对象,包含根据查询集具有可用对象的所有月份,以升序显示为datetime.datetime对象。
基于类的视图很难,值得仔细阅读文档,潜入源代码(主要是django.views.generic
)并熟悉debugging techniques来逐步完成稍微纠结的继承大多数观点。
答案 2 :(得分:0)
呀。我同意你的看法。我目前有自己的基于类的通用视图的实现工作,但我很好奇它是否“政治上正确”。无论如何,它是如何使用这个通用视图的,并且我认为这个(make_object_list)属性是编码器修补的可用选项。