如何修改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
相关产品推荐
相关产品推荐

