Django Admin自定义ManyToManyField列表展示与选择功能
可行实现方案
方案1:使用Django原生filter_horizontal/filter_vertical组件(最简单,无需额外依赖)
这是Django Admin自带的多对多字段优化组件,自带搜索框,支持双栏选择,无需按住Ctrl点选,1000条数据量级完全够用。
只需要修改admin.py中ScheduleModel的配置即可:
@admin.register(Schedule) class ScheduleModel(admin.ModelAdmin): search_fields = ('date',) list_display = ('date',) list_per_page = 100 # 新增这一行使用左右双栏选择器 filter_horizontal = ('songs',) # 如果偏好上下布局的选择器,换成这行即可:filter_vertical = ('songs',)
修改后Schedule编辑页的songs字段会变成双栏结构:左侧是待选歌曲列表,顶部有搜索框可直接搜索歌曲名,选中后点击中间的添加按钮就可以移到右侧已选列表,也支持批量选中、批量移除。
方案2:使用Django原生autocomplete_fields(更省页面空间,适配大数据量)
Django 2.0及以上版本自带的自动补全组件,基于Admin的搜索能力实现,渲染为下拉搜索框,输入关键词会实时匹配符合条件的歌曲,适合页面空间有限的场景。
使用前提是关联的Song模型的Admin配置已经设置了search_fields(你当前的代码已经满足这个条件),修改admin.py配置即可:
@admin.register(Schedule) class ScheduleModel(admin.ModelAdmin): search_fields = ('date',) list_display = ('date',) list_per_page = 100 # 新增这一行 autocomplete_fields = ('songs',)
修改后songs字段会变成可搜索的下拉多选框,输入歌曲名关键词就会自动弹出匹配结果,点击即可选中。
方案3:集成第三方前端多选组件(适合高度定制需求)
如果以上原生组件无法满足个性化需求,可以自己在Admin表单中引入Select2等成熟的多选组件,自定义渲染逻辑,支持自定义搜索规则、多选样式等,不过需要额外配置Admin的静态资源引入和表单字段重写,复杂度比前两个方案高。
内容的提问来源于stack exchange,提问作者Angelo
相关产品推荐
相关产品推荐

