Django Admin 如何实现多层嵌套 Inline?
数据小陈
结论
Django 自带的 ModelAdmin Inline 不支持在一个 Inline 中再嵌套另一个 Inline。若要在同一管理表单中按 Request → Response → RequestParam 的层级编辑数据,可以使用第三方包 django-nested-admin,将 Response 和 RequestParam 声明为嵌套 Inline。
这三个模型已有所需的外键关系:Response.request 关联 Request,RequestParam.response 关联 Response。以下配置假设这三个模型已经定义完成。
配置 django-nested-admin
安装依赖:
pip install django-nested-admin
在 settings.py 的 INSTALLED_APPS 中加入 nested_admin:
INSTALLED_APPS = [
# 其他应用
"nested_admin",
"django.contrib.admin",
# 其他 Django 应用
]
定义两层 Inline,并让 RequestAdmin 继承 NestedModelAdmin:
import nested_admin
from django.contrib import admin
from .models import Request, RequestParam, Response
class RequestParamInline(nested_admin.NestedTabularInline):
model = RequestParam
extra = 0
class ResponseInline(nested_admin.NestedStackedInline):
model = Response
inlines = (RequestParamInline,)
extra = 0
@admin.register(Request)
class RequestAdmin(nested_admin.NestedModelAdmin):
inlines = (ResponseInline,)
ResponseInline 的 inlines 属性会在每个 Response 项目中嵌入 RequestParamInline。打开或新建 Request 时,就可以在每个 Response 下编辑对应的 RequestParam。
如果项目没有使用 @admin.register,也可以这样注册:
admin.site.register(Request, RequestAdmin)
使用该包提供的管理页面资源时,根据安装版本的配置说明,在项目 URL 中加入 nested_admin 的 URL 配置。例如:
from django.urls import include, path
urlpatterns = [
path("_nested_admin/", include("nested_admin.urls")),
path("admin/", admin.site.urls),
]
注意事项
- 确认安装的
django-nested-admin版本与项目使用的 Django 版本兼容。兼容范围请参考该包对应版本的说明。 - Inline 层级由外键关系决定:
Response必须有指向Request的外键,RequestParam必须有指向Response的外键。你给出的模型符合这一结构。 - 如果不想增加第三方依赖,可以分别用普通 Inline 管理
Request → Response和Response → RequestParam,也可以编写自定义管理页面。Django 自带的 Inline 不会在每个Response项目中自动生成RequestParam表单。
备注:内容仅供参考。
