2012-08-26 5 views
5

나는 ListView에서 상속 한보기를 작성 중이며 로그인 한 사용자로보기를 제한하려고합니다.클래스 기반 뷰를 장식하는 두 가지 방법의 차이점은 무엇입니까?

https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-in-urlconf은 URLconf의 login_required로 데코 레이팅하는 것은 인스턴스별로 데코레이터를 적용합니다. 뷰의 모든 인스턴스를 데코 레이팅하려면 다른 접근 방식을 취해야한다고 말합니다 .- 데코 레이팅하는 방식 뷰 코드의 디스패치 메소드

나는 클래스와 인스턴스의 차이를 알고 있다고 생각했지만이 문구는 내게 아무 의미도 없다. 누군가 명확히 할 수 있을까요? 클래스 정의와는 달리 URLconf에 꾸미기가있는 것 외에도 두 방법의 차이점은 무엇입니까?

위의 단락은 "클래스 기반보기가 함수가 아니기 때문에 꾸미기가 as_view를 사용하는지 또는 하위 클래스를 만드는 지에 따라 다르게 작동합니다."라는 질문에 답하는 것 같습니다.

정말요 ?? Listconf의 하위 클래스에서 URLconf 접근 방식을 사용할 수있는 것 같습니다.

답변

5

상상하면 다음과 같은 클래스를 기반으로보기 있습니다

class PostListView(ListView): 
    model = Post 

ProtectedPostListView = login_required(PostListView.as_view()) 

하고 urls.py :

url(r'posts$', ProtectedPostListView) 

당신이 다음이 방법을 사용하는 경우 ProtectedPostListView 예를 들어

를 서브 클래 싱 할 수있는 능력을 잃게을
class MyNewView(ProtectedPostListView): 
    #IMPOSSIBLE 

이것은 .as_view()이 함수를 반환하기 때문입니다. login_required 데코레이터를 적용한 후에는 함수가 남아 있으므로 서브 클래스 화가 불가능합니다.

반면에 두 번째 방법, 즉 데코레이터를 사용하면 서브 클래 싱이 가능합니다. 예 :

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 
관련 문제