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

如何让Django Admin中的权限方法更符合DRY原则?

优化重复权限逻辑,实现DRY原则

当然有办法解决这个重复代码的问题!你现在的两个ModelAdmin类里重复了完全相同的权限校验逻辑,我们可以用Mixin类(混入类)来封装这些通用逻辑,完美契合DRY原则,以后维护也会轻松很多。

方案一:使用权限Mixin类

先定义一个封装了所有权限校验方法的Mixin类,然后让你的两个Admin类同时继承这个Mixin和admin.ModelAdmin:

from django.contrib import admin

# 封装通用权限逻辑的Mixin
class AdminOnlyPermissionMixin:
    def has_view_permission(self, request, obj=None):
        return request.user.is_admin
    
    def has_add_permission(self, request):
        return request.user.is_admin
    
    def has_change_permission(self, request, obj=None):
        return request.user.is_admin
    
    def has_delete_permission(self, request, obj=None):
        return request.user.is_admin
    
    def has_module_permission(self, request):
        return request.user.is_admin

# 继承Mixin + ModelAdmin,只保留各自独有的配置
class FirstAdmin(AdminOnlyPermissionMixin, admin.ModelAdmin):
    list_display = ('id', 'title', 'author')

class SecondAdmin(AdminOnlyPermissionMixin, admin.ModelAdmin):
    list_display = ('id', 'category')

为什么这么做?

  • 减少重复代码:所有通用的权限逻辑只写一次,后续新增类似的Admin类时,直接继承这个Mixin即可。
  • 易于维护:如果以后需要修改权限规则(比如增加对其他用户组的支持),只需要修改AdminOnlyPermissionMixin里的代码,所有继承它的Admin类都会自动生效。
  • 符合Django最佳实践:Mixin是Django中复用类逻辑的常用方式,灵活性很高,不会影响你后续给Admin类添加其他自定义逻辑。

额外优化:简化权限方法

你原来的代码里用if判断后返回True,但其实可以直接返回request.user.is_admin的布尔值,这样代码更简洁,逻辑也更清晰——因为当request.user.is_admin为True时返回True,否则返回False,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:17:31