django-nested-admin能否对select-to-change列表顶级项排序
问题背景
- 已成功使用
django-nested-admin实现内联(inline)项的排序,效果如下:
- 现存问题:无法对select-to-change列表中的顶级项(top level items)实现排序,尝试将
django-nested-admin与django-admin-sortable2搭配使用也未能解决该问题,对应场景如下:
现有实现代码
models.py
# "models.py" from django.db import models class Country(models.Model): name = models.CharField(max_length=100) position = models.PositiveSmallIntegerField("Position", null=True, blank=True) class Meta: ordering = ('position',) def __str__(self): return self.name class Province(models.Model): name = models.CharField(max_length=100) country = models.ForeignKey(Country, on_delete=models.PROTECT) position = models.PositiveSmallIntegerField("Position", null=True) class Meta: ordering = ('position',) def __str__(self): return self.name class City(models.Model): name = models.CharField(max_length=100) province = models.ForeignKey(Province, on_delete=models.PROTECT) position = models.PositiveSmallIntegerField("Position", null=True) class Meta: ordering = ('position',) def __str__(self): return self.name
admin.py
# "admin.py" from django.contrib import admin from nested_admin import SortableHiddenMixin, NestedTabularInline, NestedModelAdmin from .models import Country, Province, City class CityInline(SortableHiddenMixin, NestedTabularInline): model = City sortable_field_name = "position" class ProvinceInline(SortableHiddenMixin, NestedTabularInline): model = Province sortable_field_name = "position" inlines = (CityInline,) @admin.register(Country) class CountryInlineAdmin(SortableHiddenMixin, NestedModelAdmin): sortable_field_name = "position" inlines = (ProvinceInline,)
咨询问题
- 是否存在可行方案实现select-to-change列表中顶级项的排序?
- 是否
django-nested-admin本身不支持顶级项排序功能?
解答
核心结论
django-nested-admin本身不支持顶级项排序。它提供的SortableHiddenMixin排序能力仅作用于嵌套内联编辑区块,也就是你已经实现成功的省、市这类内嵌在父级编辑页内的条目排序,对顶级模型自身的列表排序、外键选择下拉列表的排序逻辑没有内置支持。
可行实现方案
不需要强行混用两个库的能力,按作用域拆分配置即可实现需求:
- 修正现有admin配置错误:
SortableHiddenMixin是专门为内联类设计的,不要在顶级NestedModelAdmin上继承该类,否则不仅不会生效,还可能和其他库的前端资源产生冲突,这也是之前搭配django-admin-sortable2失败的核心原因。 - 你已经在
Country模型的Meta类中配置了ordering = ('position',),Django默认所有外键选择下拉、模型列表查询都会遵循这个排序规则,只要Country条目的position字段值正确,select-to-change列表自然会按设定的顺序展示。 - 顶级
Country的排序维护不需要依赖django-nested-admin:- 如果只需要下拉列表顺序正确,直接在
Country的admin配置中加上list_display = ('name', 'position'),手动维护每个条目的position值即可 - 如果需要在
Country列表页拖拽调整顺序,单独给顶级Country的admin类接入django-admin-sortable2的列表排序能力即可,和内联部分用的django-nested-admin排序逻辑作用域完全独立,不会产生冲突。所有排序调整最终都会写入position字段,下拉列表会自动同步排序结果。
- 如果只需要下拉列表顺序正确,直接在
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

