包装 as_view() 的 Django mixins
在Django的文档中,我发现了关于使用mixins的一个片段,这些mixins可以包裹as_view()
方法,从而提供额外的功能,具体内容可以参考Class based views - Mixins。
from django.contrib.auth.decorators import login_required
class LoginRequiredMixin(object):
@classmethod
def as_view(cls, **initkwargs):
view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
return login_required(view)
class MyView(LoginRequiredMixin, ...):
# this is a generic view
...
在上面的例子中,作者把标准的as_view()
方法放在一个mixin里,这样每个继承自LoginRequiredMixin
的视图都会经过login_required
这个装饰器的处理。
我有个问题:为了让这一行代码正常工作,
view = super(LoginRequiredMixin, cls).as_view(**initkwargs),
难道MyView
不也应该继承自View
吗?否则我觉得调用super的时候会出错,因为object
是没有as_view()
这个方法的。
谢谢!
1 个回答
2
你应该从任何通用的基于类的视图继承。Django定义的所有通用视图都是从基础的 View
类继承而来的。三个点(...
)只是一个占位符,代表任何通用视图类,并不是字面上的意思(如果这样理解就会出错)。
顺便提一下,装饰基于类的视图最常见的方法是用 method_decorator
来包装 dispatch
方法,这个 method_decorator
是从 django.utils.decorators
中来的。你还可以查看一下 装饰类视图 的相关内容。