PAYATHON 2026

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 表单。

备注:内容仅供参考。