在Django Admin的Project模型中关联排序Asset的方案咨询
实现方法
1. 给Asset模型添加排序字段
首先需要在Asset模型中新增一个用于存储顺序的字段(比如order),同时配置默认排序规则:
# models.py from django.db import models class Project(models.Model): name = models.CharField(max_length=100) # 其他业务字段... class Asset(models.Model): project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='assets') name = models.CharField(max_length=100) order = models.IntegerField(default=0) # 其他业务字段... class Meta: ordering = ['order'] # 默认按order字段排序
2. 借助第三方包实现拖拽排序
使用django-sortable2可以快速在Admin的Inline中实现拖拽排序,无需逐个修改排序字段:
安装依赖
pip install django-sortable2
配置Admin
在admin.py中继承SortableInlineAdminMixin,将Asset作为Project的Inline组件,并指定排序字段:
# admin.py from django.contrib import admin from django_sortable2.admin import SortableInlineAdminMixin from .models import Project, Asset class AssetInline(SortableInlineAdminMixin, admin.TabularInline): model = Asset fields = ('name', 'order') # 按需调整显示字段 extra = 0 # 隐藏额外空表单 sortable_field_name = 'order' # 指定绑定的排序字段 @admin.register(Project) class ProjectAdmin(admin.ModelAdmin): inlines = [AssetInline] # 其他Project的Admin配置...
配置完成后,在Project的编辑页面,下属的Asset会以表格形式展示,直接拖拽行即可调整顺序,系统会自动同步更新每个Asset的order字段值。
3. 无第三方包的手动实现(可选)
如果不想依赖第三方工具,也可以通过自定义Admin模板和原生JS实现:
- 在AssetInline中保留
order字段的输入框,允许用户手动输入数字调整顺序(体验略差) - 自定义Admin的
change_form模板,引入HTML5拖拽API,监听拖拽事件动态更新每行的order值,提交表单时保存
这种方式需要编写较多自定义代码,推荐优先使用成熟第三方包提升效率。
内容的提问来源于stack exchange,提问作者Javier Aramberri
相关产品推荐
相关产品推荐

