包含as_view()的Django mixins

时间:2014-07-12 20:54:37

标签: python django django-views multiple-inheritance mixins

在Django docs Class based views - Mixins中,我找到了以下关于使用包含as_view()方法的mixin来提供额外功能的片段:

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吗?否则,我认为由于object没有as_view()方法,对super的调用会失败。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您应该从任何基于类的通用视图继承。 Django定义的所有通用视图都从基类View类继承。三个点(...)是任何通用视图类的占位符,它们不是文字的(这样做会出现语法错误)。

顺便说一句,装饰基于类的视图最常用的方法是使用dispatch中的method_decoratordjango.utils.decorators方法包装在装饰器中。另请查看decorating class-based views