You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Django子类视图继承的权限类?

可以实现,Django 内置通用视图原生支持该需求,无需引入额外依赖,可根据你的权限实现方式选择对应方案:


方案1:权限类为普通Django混入类(适配你当前基于继承的写法)

Python 类的方法解析顺序遵循从左到右优先级规则,你只需调整子类的继承顺序,将新权限类放在最左侧,即可覆盖父类继承的旧权限校验逻辑:

class MyPermissionChild(UserPassesTestMixin):
    def test_func(self):
        # 你的新权限校验逻辑
        return ...

class MyChildView(MyPermissionChild, MyView):
    # 也可直接重写test_func方法完全自定义权限逻辑,不需要额外继承
    # def test_func(self):
    #     return ...

如果需要完全移除父类所有权限校验逻辑,也可直接在子类重写dispatch方法跳过父类的权限校验入口:

class MyChildView(MyView):
    def dispatch(self, request, *args, **kwargs):
        # 这里直接走FormView的原生dispatch逻辑,跳过父类继承的权限混入校验
        return super(MyView, self).dispatch(request, *args, **kwargs)

方案2:基于permission_classes属性配置(更易维护的写法)

如果是Django REST Framework 场景,通用视图内置支持permission_classes属性,直接在子类重写该属性即可完成替换:

class MyView(FormView):
    # 父类权限配置
    permission_classes = [MyPermission1, MyPermission2]

class MyChildView(MyView):
    # 子类直接覆盖权限配置
    permission_classes = [MyPermissionChild]

普通Django通用视图如果要使用该配置方式,只需自定义一个统一的权限校验混入类即可,完全基于原生能力实现:

class PermissionMixin:
    def dispatch(self, request, *args, **kwargs):
        for permission in self.permission_classes:
            if not permission().has_permission(request, self):
                raise PermissionDenied
        return super().dispatch(request, *args, **kwargs)

# 父类引入该混入后即可通过属性配置权限
class MyView(PermissionMixin, FormView):
    permission_classes = [MyPermission1, MyPermission2]

内容的提问来源于stack exchange,提问作者darkhorse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 13:36:00