我有一个管理混合,我用它来阻止缓存并确保用户通过覆盖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中的很多行并重复大量代码。
有关如何创建此装饰器包装器的任何想法吗?
答案 0 :(得分:0)
在URLconf中使用装饰器完全违背了CBV的精神。相反,使用mixins将功能直接添加到视图类的dispatch
方法。