包装 as_view() 的 Django mixins

0 投票
1 回答
722 浏览
提问于 2025-04-18 13:05

在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 中来的。你还可以查看一下 装饰类视图 的相关内容。

撰写回答