2

我有一个管理 mixin,用于防止缓存并确保用户通过覆盖 dispatch() 登录。它正在我的基于类的视图中使用。

# mixins.py
from django.contrib.admin.views.decorators import staff_member_required
from django.utils.decorators import method_decorator
from django.views.decorators.cache import never_cache

class AdminPageMixin(object):
    @method_decorator(never_cache)
    @method_decorator(staff_member_required)
    def dispatch(self, request, *args, **kwargs):
        return super(AdminPageMixin, self).dispatch(request, *args, **kwargs)

# views.py
class SomeAdminView(AdminPageMixin, ListView):

当我尝试针对 SomeAdminView 运行单元测试时遇到了问题。是的,我知道我可以使用 django 的测试客户端登录,但我试图远离编写功能测试。相反,我想将 AdminPageMixin 功能包装到单个装饰器中并在 urls.py 中调用该装饰器,如下所示:

url(r'^myurl/$', decorator_wrapper(SomeAdminView.as_view()), name='some-admin-view'),

或者,我可以这样做:

url(r'^myurl/$', never_cache(staff_member_required(SomeAdminView.as_view())), name='some-admin-view'),

但是如果我想添加第三个或第四个装饰器,我会更新 urls.py 中的很多行并重复很多代码。

任何想法如何创建这个装饰器包装器?

4

1 回答 1

0

在 URLconfs 中使用装饰器是完全违背 CBV 的精神的。相反,使用 mixins 将功能直接添加到dispatch视图类的方法中。

于 2013-10-12T12:36:02.530 回答