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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:05:43