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

