在django中包含通用视图 - 如何以正确的方式执行?

时间:2016-05-20 10:18:44

标签: django django-views django-generic-views

我有家庭的TemplateView和活动组织者的网站页面。现在我想在两个模板中包含一个模板,其中包含接下来三个事件的列表,如下所示:

{% include "next-events.html"%}

由于这个模板应该包含在这两个页面中,我考虑过只为下一个事件编写一个ListView,并将其包含在我的家中和视图中。

class NextEventsView(ListView):
    """ a preview of the next events """
    queryset = Event.objects.filter(date__gte=datetime.date.today()).order_by('date')[:3]
    context_object_name = 'next_events'

class HomePageView(TemplateView, NextEventsView):
    template_name = "home/home.html"

class AboutPageView(TemplateView, NextEventsView):
    template_name = "home/about.html"

但我还没有完全理解ListView通用视图如何获得它的object_list。如果我这样包含,我会收到以下错误:

AttributeError: 'HomePageView' object has no attribute 'object_list'

可以通过将object_list添加到HomePageView来解决这个问题,但这不是正确的解决方案。

任何人都能解释一下,如何以正确的方式进行这样的包容?

提前致谢!

1 个答案:

答案 0 :(得分:2)

你已经以错误的方式列出了超类; ListView中的一些方法比TemplateView中的方法更具体,但由于后者首先列出,因此将在那里找到方法。

然而,似乎根本不需要从TemplateView继承。 ListView已经完成,并允许您设置template_name。只需从继承中删除TemplateView。