2012-08-26 17 views
5

Piszę widok, który dziedziczy z ListView i próbuję ograniczyć widok do zalogowanych użytkowników.Jaka jest różnica między dwoma metodami dekorowania widoków opartych na klasach?

https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-in-urlconf mówi, że zdobienia z login_required w URLconf „stosuje dekorator na podstawie na przykład. Jeśli chcesz każdy przypadek celu być urządzone, trzeba podjąć inne podejście” -to jest podejście do dekoracji metoda wysyłki w kodzie widoku.

Pomyślałem, że znam różnicę między klasą a instancją, ale to zdanie nie ma dla mnie znaczenia. Czy ktoś mógłby wyjaśnić? Oprócz tego, że dekorator w URLconf jest przeciwieństwem definicji twojej klasy, jakie są różnice między tymi dwoma podejściami?

Powyższy akapit wydaje się odpowiadać na pytanie: "Ponieważ widoki klasowe nie są funkcjami, dekorowanie ich działa inaczej, w zależności od tego, czy używasz as_view, czy tworzysz podklasę."

Naprawdę? Wydaje mi się, że mogę używać podejścia URLconf z moją podklasą ListView.

Odpowiedz

5

Wyobraź sobie, że masz następujące klasy widoku oparta:

class PostListView(ListView): 
    model = Post 

ProtectedPostListView = login_required(PostListView.as_view()) 

i Twojego urls.py:

url(r'posts$', ProtectedPostListView) 

Jeśli używasz tego podejścia wtedy tracą zdolność do podklasy ProtectedPostListView np

class MyNewView(ProtectedPostListView): 
    #IMPOSSIBLE 

a to dlatego, że .as_view() zwraca funkcję i po zastosowaniu dekoratora login_required pozostaje funkcja, więc podklasowanie nie jest możliwe.

Z drugiej strony, jeśli zastosujesz drugie podejście, tj. Użyjesz dekoratora metody, możliwe będzie podklasowanie. np.

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