2012-04-26 4 views
13

Je me vois constamment devoir ajouter la même variable supplémentaire au contexte de plusieurs de mes vues.Extension de classes de vues génériques pour common get_context_data

def get_context_data(self, **kwargs): 
    # Call the base implementation first to get a context 
    context = super(MyListView, self).get_context_data(**kwargs) 
    # Add in the house 
    context['house'] = self.get_object().house 
    return context 

Comme je n'aime pas me répéter, je pensais que je pouvais créer une nouvelle classe étendant la vue et je pourrais fonder toutes mes vues sur la nouvelle classe de vue étendue. Le truc, c'est que j'utilise 4 classes de vues: CreateView, UpdateView, ListView et DeleteView. Dois-je vraiment créer une nouvelle classe pour chacun d'entre eux?

N'y at-il pas quelque chose comme une classe de vue django "base"? Peut-être une façon plus intelligente de le faire? Merci d'avance!

+0

Ceci est une solution potentielle bien que je ne suis pas sûr que je suis tout ce qui l'intéresse - http://reinout.vanrees.org/weblog/2014/05/19/context.html – rix

Répondre

19

Créer une mixin:

from django.views.generic.base import ContextMixin 

class HouseMixin(ContextMixin): 
    def get_house(self): 
    # Get the house somehow 
    return house 

    def get_context_data(self, **kwargs): 
    ctx = super(HouseMixin, self).get_context_data(**kwargs) 
    ctx['house'] = self.get_house() 
    return ctx 

Ensuite, dans vos autres classes que vous utiliserions l'héritage multiple:

class HouseEditView(HouseMixin, UpdateView): 
    pass 

class HouseListView(HouseMixin, ListView): 
    pass 

et ainsi de suite, toutes ces vues auront house dans le contexte.

+3

Wow cela a effectivement fonctionné! Je pensais que super (HouseMixin, self) .get_context_data (** kwargs) retournerait une erreur, car le super de HouseMixin est un objet et un objet n'a pas défini get_context_data. Pouvez-vous m'expliquer pourquoi cela fonctionne? – Clash

+3

Cela fonctionne tant que l'une des classes parentes implémente la méthode, sinon, elle déclencherait une erreur. Donc, ce mixin est conçu pour être mélangé avec n'importe quelle vue Django qui implémente aussi .get_context_data(). –

+1

est-ce que cela a à voir avec l'ordre dans lequel les classes sont étendues? ie HouseMixin, UpdateView au lieu de UpdateView, HouseMixin – Clash

Questions connexes