3

閱讀'ProDjango'一書,我發現了在基於類的視圖中將自定義裝飾器應用於方法的有趣時刻。如何在基於類的視圖中應用裝飾器調度方法Django

作者說,我們可以手動分配裝飾類的每一個方法,即getpost等等,或者我們可以我們的裝飾添加到dispatch()方法,如果我們這樣做,然後裝飾器將被應用到每個方法類(getpost等)的

的問題是:

如何其實我可以申請裝飾派遣()基於類的視圖的方法?

回答

3

您可以使用修飾器method_decorator,如docs所示。

從文檔:

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())), 
) 

更新:

由於Django的1.9,你現在可以使用的方法裝修者在課堂上的水平。您需要傳遞要裝飾的方法的名稱。所以沒有必要爲了應用裝飾器而重寫dispatch。

實施例:

@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

這是否'@method_decorator(login_required)'只會增加我的裝飾來分派方法保存所有它的默認功能? – micgeronimo 2015-01-26 18:57:11

+0

是的,除非我誤解默認功能的含義。 – schillingt 2015-01-26 19:27:13

相關問題