在Django Admin中为继承的Many2Many关系创建TabularInline
问题描述
我有一个Tag模型和TagMixin,用来给实体动态添加标签:
class Tag(models.Model): name = models.CharField(max_length=64, unique=True) class TagMixin(models.Model): class Meta: abstract = True tags = models.ManyToManyField(Tag, blank=True)
创建新实体时这套逻辑运行正常,比如创建Item模型时会自动生成多对多关联表:
class Item(TagMixin): name = models.CharField(max_length=64)
现在想在Item的Admin后台视图里,把标签设置成TabularInline输入项,请问该怎么完成下面的配置?
class ItemTagInline(admin.TabularInline): model = ? @admin.register(models.Item) class ItemAdmin(admin.ModelAdmin): list_display = ("id", "name") inlines = [ItemTagInline]
解决方法
当通过抽象类的多对多字段生成关联表时,Django会自动创建对应的中间模型,你可以通过<主模型>.tags.through直接获取这个自动生成的中间模型,无需硬编码模型名,避免后续修改字段或模型名导致出错。
修改后的Admin配置如下:
from django.contrib import admin from .models import Item class ItemTagInline(admin.TabularInline): model = Item.tags.through # 控制默认显示的空白输入行数,可根据需求调整 extra = 1 @admin.register(Item) class ItemAdmin(admin.ModelAdmin): list_display = ("id", "name") inlines = [ItemTagInline] # 必须排除原有的tags字段,否则后台会同时显示Inline表单和原生的多对多选择控件,造成重复 exclude = ("tags",)
如果需要自定义Inline的展示字段,比如只显示标签选择框,可以添加fields属性:
class ItemTagInline(admin.TabularInline): model = Item.tags.through fields = ("tag",) extra = 1
内容的提问来源于stack exchange,提问作者jlandercy
相关产品推荐
相关产品推荐

