2016-05-20 1 views
1

J'ai TemplateView pour la maison et sur les pages d'un site Web pour un organisateur d'événements. Maintenant, je veux inclure un modèle avec une liste des trois prochains événements dans les deux modèles comme celui-ci:Inclusion de vues génériques dans django - comment le faire de la bonne façon?

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

Étant donné que ce modèle doit être inclus dans les deux pages, je pensais à écrire un ListView seulement pour les prochains événements et l'inclure dans ma maison et sur les points de vue.

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" 

Mais je n'ai pas entièrement compris comment la vue générique ListView obtient sa liste d'objets. Si j'inclus comme ça, je reçois l'erreur suivante:

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

qui peut être résolu en ajoutant object_list au HomePageView, mais qui ne peut pas être la bonne solution.

Quelqu'un peut-il expliquer, comment faire une telle inclusion de la bonne façon?

Merci d'avance!

Répondre

2

Vous avez listé les superclasses dans le mauvais sens; Certaines méthodes de ListView sont plus spécifiques que celles de TemplateView, mais comme cette dernière est listée en premier, les méthodes seront trouvées à la place.

Cependant, il ne semble pas nécessaire d'hériter de TemplateView. ListView le fait déjà, et vous permet de définir un template_name quand même. Il suffit de supprimer le TemplateView de l'héritage.

+0

merci pour cela! – setchock