2012-04-26 28 views
13

Mi vedo costantemente dover aggiungere la stessa variabile extra al contesto di molte delle mie visualizzazioni.Estensione di classi di viste generiche per get_context_data comune

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 

Come non mi piace ripetermi, ho pensato che avrei potuto creare una nuova classe che estende la vista e quindi ho potuto basare tutte le mie opinioni sulla nuova classe di visualizzazione estesa. Il fatto è che ci sono 4 classi di visualizzazioni che utilizzo: CreateView, UpdateView, ListView e DeleteView. Devo davvero creare una nuova classe per ognuno di loro?

Non c'è qualcosa come una classe di visualizzazione "base" django? Forse un modo più intelligente per farlo? Molte grazie in anticipo!

+0

Questa è una soluzione potenziale anche se non sono sicuro di esserne entusiasta - http://reinout.vanrees.org/weblog/2014/05/19/context.html – rix

risposta

19

Creare un 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 

Poi nelle altre classi devi usare l'ereditarietà multipla:

class HouseEditView(HouseMixin, UpdateView): 
    pass 

class HouseListView(HouseMixin, ListView): 
    pass 

e così via, allora tutti questi punti di vista avranno house nel contesto.

+3

Wow questo ha funzionato davvero! Ho pensato super (HouseMixin, self) .get_context_data (** kwargs) restituirebbe un errore, perché il super di HouseMixin è oggetto e l'oggetto non ha definito get_context_data. Puoi spiegarmi perché funziona? – Clash

+3

Funziona fintanto che una delle classi genitore implementa il metodo, se non ce l'ha, verrebbe generato un errore. Quindi questo mixin è progettato per essere combinato con qualsiasi vista Django che implementa anche .get_context_data(). –

+1

ha a che fare con l'ordine di estensione delle classi? ie HouseMixin, UpdateView invece di UpdateView, HouseMixin – Clash

Problemi correlati