2012-08-26 13 views
5

Sto scrivendo una vista che eredita da ListView e sto provando a restringere la vista agli utenti loggati.Qual è la differenza tra i due metodi di decorazione delle viste basate su classi?

https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-in-urlconf dice che decorare con login_required nell'URLconf "applica il decoratore su una base per-instance.Se vuoi che ogni istanza di una vista sia decorata, devi adottare un approccio diverso" -che l'approccio è decorare il metodo di spedizione nel codice della vista.

Pensavo di conoscere la differenza tra una classe e un'istanza, ma questa frase non significa nulla per me. Qualcuno potrebbe chiarire? Oltre ad avere un decoratore in URLconf in contrapposizione alla definizione della tua classe, quali sono le differenze tra i due approcci?

Il paragrafo sopra riportato sembra rispondere alla domanda: "Poiché le viste basate su classi non sono funzioni, la loro decorazione funziona in modo diverso a seconda che si utilizzi as_view o si crei una sottoclasse."

Davvero ?? Mi sembra di essere in grado di utilizzare l'approccio URLconf con la mia sottoclasse di ListView.

risposta

5

Immaginate di avere la seguente visualizzazione basata classe:

class PostListView(ListView): 
    model = Post 

ProtectedPostListView = login_required(PostListView.as_view()) 

e la tua urls.py:

url(r'posts$', ProtectedPostListView) 

Se si utilizza questo approccio, allora si perde la capacità di creare una sottoclasse ProtectedPostListView esempio

class MyNewView(ProtectedPostListView): 
    #IMPOSSIBLE 

e questo perché .as_view() restituisce una funzione e dopo aver applicato il decoratore login_required viene lasciata una funzione, quindi la sottoclasse non è possibile.

D'altra parte, se si segue il secondo approccio, utilizzare il metodo decoratore è possibile la sottoclasse. , ad esempio

class PostListView(ListView): 
    model = Post 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(PostListView, self).dispatch(*args, **kwargs) 

class MyNewView(PostListView): 
    #LEGAL 
Problemi correlati