Включение общих представлений в django — как это сделать правильно?

У меня есть 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, но это не может быть правильным решением.

Кто-нибудь может объяснить, как правильно сделать такое включение?

Заранее спасибо!


person setchock    schedule 20.05.2016    source источник


Ответы (1)


Вы неправильно перечислили суперклассы; некоторые методы в ListView более специфичны, чем в TemplateView, но, поскольку последний указан первым, вместо него будут найдены методы.

Однако, похоже, вообще нет необходимости наследовать от TemplateView. ListView уже это делает и позволяет вам в любом случае установить имя_шаблона. Просто удалите TemplateView из наследства.

person Daniel Roseman    schedule 20.05.2016