【问题标题】:Django mixins that wrap as_view()包装 as_view() 的 Django mixins
【发布时间】:2014-09-03 05:30:55
【问题描述】:

在 Django 文档 Class based views - Mixins 中,我发现了以下关于使用包装 as_view() 方法以提供额外功能的混合的 sn-p:

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() 方法而失败。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 在示例代码中,由于 3 个点,它可能不够清晰,但 MyView 似乎仅继承自 LoginRequiredMixin 而不是 View。我假设 super 将失败是基于 MyView 可能不会从 View 继承的事实(我只看到 3 个点),因此没有 as_view() 方法供 super 调用。所以,不管 MRO,我是对的吗?
    • @Konos5 抱歉,我看错了你的问题,我以为你在问LoginRequiredMixin 的基类。在我的脑海中,我会自动将... 替换为适当的类:P 但无论如何,你是对的,我更新了我的答案。这就是为什么它是一个 view mixin。
    • 太棒了!这正是我想知道的!也为视图继承解释点赞!
    猜你喜欢
    • 2013-01-19
    • 2015-06-25
    • 2015-10-08
    • 2021-02-13
    • 2021-01-12
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    相关资源
    最近更新 更多