3

'ProDjango'서적을 읽으면 클래스 기반 뷰의 메서드에 사용자 정의 데코레이터를 적용하는 흥미로운 순간을 발견했습니다.클래스 기반 뷰에서 데코레이터를 전달하는 방법 Django

저자는 우리가 수동으로 클래스의 각 방법, 즉, get, post에 장식을 할당 할 수 있습니다 등등, 또는 우리가 dispatch() 방법으로 우리의 장식을 추가 할 수 있으며 우리가 다음 할 경우 장식이 각각의 방법에 적용됩니다 말한다 클래스 (get, post 등)의

질문은 다음과 같습니다

나는) (클래스 기반의 뷰의 방법을 파견 장식을 적용 할 수있는 방법을 실제로?

답변

3

여기에 표시된 장식 자 method_decoratordocs에 사용할 수 있습니다.

from django.contrib.auth.decorators import login_required 
from django.utils.decorators import method_decorator 
from django.views.generic import TemplateView 

class ProtectedView(TemplateView): 
    template_name = 'secret.html' 

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

또는 당신이 당신의 urls.py에서 작업을 수행 할 수 있습니다 :

from django.conf.urls import patterns 
from django.contrib.auth.decorators import login_required 
from myapp.views import MyView 

urlpatterns = patterns('', 
    (r'^about/', login_required(MyView.as_view())), 
) 

업데이트 :

장고 1.9로, 지금 방법을 사용할 수있는 워드 프로세서

클래스 수준의 장식 자. 데코 레이팅 할 메소드의 이름을 전달해야합니다. 따라서 데코레이터를 적용하기 위해 디스패치를 ​​재정의 할 필요가 없습니다.

예 :

@method_decorator(login_required, name='dispatch') 
class ProtectedView(TemplateView): 
    template_name = 'secret.html' 

또한, 당신은 장식의 목록 또는 튜플을 정의하고 대신 method_decorator() 여러 번 호출하는이를 사용할 수 있습니다.

예 (아래 두 개의 클래스가 동일) :

decorators = [never_cache, login_required] 

@method_decorator(decorators, name='dispatch') 
class ProtectedView(TemplateView): 
    template_name = 'secret.html' 

@method_decorator(never_cache, name='dispatch') 
@method_decorator(login_required, name='dispatch') 
class ProtectedView(TemplateView): 
    template_name = 'secret.html' 
+0

은 (login_required)이'@method_decorator은'유일한 방법은 모든 IT의 기본 기능을 절약 파견 내 장식을 추가 할 것입니까? – micgeronimo

+0

네, 기본 기능이 무슨 뜻인지 오해하고있는 경우를 제외하고는 그렇습니다. – schillingt