1. 功能介绍
在 Django Admin 中,inline 功能是一种用于管理关联模型(尤其是一对多关系) 的便捷方式。它允许你在编辑 “主模型”的 Admin 页面中,直接嵌入并编辑其关联的 “子模型”,而无需跳转到子模型的单独管理页面。
当两个模型存在外键关联时,使用 inline 可以:
- 在同一个页面内同时编辑主模型和关联的子模型数据
- 保持数据关联性,避免频繁切换页面
- 简化操作流程,提升后台管理效率
举个例子:
以商品项目中的Product(商品)和ProductImage(商品图片)模型为例:
Product是主模型,ProductImage是子模型(通过外键关联Product)。- 不使用 inline 时:需要先保存商品,再到
ProductImage管理页面逐个添加图片,并手动选择关联的商品,操作繁琐。 - 使用 inline 时:在编辑
Product的页面中,会直接显示ProductImage的编辑区域,可直接上传图片并关联当前商品,无需跳转。
2. 实现方式
在admin.py中通过定义子模型的Inline类,并关联到主模型的 Admin 配置中实现,常见的有两种显示类型:
StackedInline:子模型字段以 “堆叠式” 布局显示(垂直排列,类似表单)。TabularInline:子模型字段以 “表格式” 布局显示(紧凑,适合批量编辑)。
from django.contrib import admin
from .models import Product, ProductImage
# 定义商品图片的Inline类(子模型)
class ProductImageInline(admin.StackedInline): # 或 admin.TabularInline
model = ProductImage # 指定关联的子模型
extra = 2 # 默认显示2个空的图片上传框(方便批量添加)
# 主模型Admin配置
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
inlines = [ProductImageInline] # 嵌入子模型的Inline配置
# 其他配置...
配置后,在 Admin 编辑Product的页面下方,会出现ProductImage的编辑区域:
- 可直接上传图片、填写
alt_text、设置is_cover等字段 - 点击 “添加另一个 商品图片” 可动态增加更多图片编辑框
- 保存商品时,关联的图片会自动与当前商品绑定(外键自动填充)
3. 基础配置
定义inline类时,可通过以下参数控制其行为
from django.contrib import admin
from .models import Product, ProductImage
class ProductImageInline(admin.StackedInline): # 或 TabularInline
# 1. 必选:关联的子模型
model = ProductImage # 必须指定子模型(如ProductImage)
# 2. 可选:默认显示的空表单数量(用于新增)
extra = 1 # 默认显示1个空表单,可改为0(不显示空表单)
# 3. 可选:最多可添加的子模型实例数量
max_num = 5 # 限制最多上传5张图片
# 4. 可选:最少需要添加的子模型实例数量
min_num = 1 # 强制至少上传1张图片(否则保存时会报错)
# 5. 可选:当主模型有多个外键指向子模型时,指定使用哪个外键
# fk_name = "product" # 若子模型有多个外键关联主模型,需显式指定
# 6. 可选:是否允许删除已有的子模型实例
can_delete = True # 默认True,设为False则隐藏"删除"按钮
# 7. 可选:是否显示"添加另一个"按钮(动态增加空表单)
show_change_link = False # 默认False,设为True则显示跳转链接
# 8. 可选:控制显示的字段(白名单)
fields = ("image", "alt_text", "is_cover", "sort_order") # 只显示这些字段
# 9. 可选:排除不显示的字段(黑名单)
# exclude = ("created_at",) # 不显示created_at字段
# 10. 可选:对字段分组显示(类似ModelAdmin的fieldsets)
fieldsets = (
("图片信息", {
"fields": ("image", "alt_text")
}),
("属性设置", {
"fields": ("is_cover", "sort_order"),
"classes": ("collapse",) # 可折叠
})
)
发表评论