如何将Django Admin中User权限布局复用至其他多对多字段模型?
当然可以实现!
Django Admin里User对象的权限选择布局(就是那个左右分栏、支持批量选择的界面)其实是靠几个内置组件实现的,你完全可以把这套布局复刻到自己的模型Admin中,步骤很清晰:
核心原理:用filter_horizontal/filter_vertical渲染多对多字段
UserAdmin里的权限/组选择界面,本质是用了Django Admin提供的filter_horizontal属性(想要垂直布局就用filter_vertical),它会自动把多对多字段渲染成左右双栏的选择器——左边是未选选项,右边是已选选项,支持批量添加/移除,和你看到的User权限界面完全一致。
具体实现步骤
假设你的目标模型是MyModel,它和另一模型RelatedModel有多对多关联(比如字段名为related_items),下面是具体代码:
1. 导入必要模块
from django.contrib import admin from .models import MyModel, RelatedModel
2. 自定义Admin类,复刻UserAdmin的布局结构
class MyModelAdmin(admin.ModelAdmin): # 复刻UserAdmin的字段分组结构,按需调整字段 fieldsets = ( # 第一组:模型的基础信息字段 ('基础信息', { 'fields': ('name', 'description') # 替换成你的模型实际字段 }), # 第二组:多对多关联字段,做成折叠面板(可选) ('关联选项', { 'fields': ('related_items',), # 这里填你的多对多字段名 'classes': ('collapse',), # 加上这个可以让面板默认折叠,和UserAdmin的权限面板一致 }), ) # 关键!启用双栏选择器 filter_horizontal = ('related_items',) # 注册模型和对应的Admin类 admin.site.register(MyModel, MyModelAdmin)
进阶:复刻权限分组逻辑(如果需要)
如果你的关联模型(比如自定义的权限模型)需要像Django自带的Permission那样按分类显示(比如按所属APP分组),可以做以下调整:
- 确保关联模型有分组字段(比如
category) - 在关联模型的Admin类中设置
list_filter,或者自定义表单的ModelChoiceField来实现分组渲染 - 参考Django自带
Permission模型的__str__方法,让选项显示更清晰(比如包含分组信息)
效果验证
启动Django服务后,进入MyModel的Admin编辑页面,你会看到related_items字段的布局和UserAdmin里的权限选择完全一致——左右双栏,支持批量选择、搜索筛选,体验和原生User权限界面一模一样。
内容的提问来源于stack exchange,提问作者Ivo Van de Grift
相关产品推荐
相关产品推荐

