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

相关问题