Django Admin TabularInline:如何隐藏多对多关联模型的对象名称?
在Django Admin中隐藏TabularInline里多对多关联模型的默认对象名称
默认情况下,Django自动生成的多对多关联(through)模型未定义__str__方法,因此在Admin的TabularInline中会显示类似「Unit_attribute object (3)」的默认对象名称。以下是几种解决方法:
方法1:显式定义关联模型并添加__str__
通过显式声明through模型,自定义字符串展示逻辑,彻底替换默认的对象名称:
修改models.py:
class Attribute(models.Model): name = models.CharField(max_length=45) def __str__(self): return self.name # 给Attribute添加友好的字符串显示 class UnitAttribute(models.Model): unit = models.ForeignKey('Unit', on_delete=models.CASCADE) attribute = models.ForeignKey(Attribute, on_delete=models.CASCADE) class Meta: db_table = 'core_unit_attributes' # 对应自动生成的表名,格式为「app名_主模型名_关联模型名」 unique_together = ('unit', 'attribute') def __str__(self): return self.attribute.name # 显示关联的Attribute名称 class Unit(models.Model): attributes = models.ManyToManyField(Attribute, through=UnitAttribute)
修改admin.py:
from django.contrib import admin from core.models import Attribute, Unit, UnitAttribute class UnitAttributeInline(admin.TabularInline): model = UnitAttribute # 使用显式定义的关联模型 @admin.register(Unit) class UnitAdmin(admin.ModelAdmin): inlines = [UnitAttributeInline]
方法2:在Admin中动态给自动生成的关联模型添加__str__
如果不想修改models.py,可直接在admin代码中给自动生成的through模型注入__str__方法:
修改admin.py:
from django.contrib import admin from core.models import Attribute, Unit # 给自动生成的关联模型添加自定义字符串显示 Unit.attributes.through.__str__ = lambda self: f"{self.attribute.name}" class UnitAttributeInline(admin.TabularInline): model = Unit.attributes.through @admin.register(Unit) class UnitAdmin(admin.ModelAdmin): inlines = [UnitAttributeInline]
方法3:通过Inline配置隐藏默认对象列
如果不需要显示该对象名称列,可直接指定Inline要展示的字段,默认的对象列会被替换为你指定的字段:
修改admin.py:
from django.contrib import admin from core.models import Attribute, Unit class UnitAttributeInline(admin.TabularInline): model = Unit.attributes.through fields = ('attribute',) # 只展示关联的Attribute字段,默认的对象列会消失 @admin.register(Unit) class UnitAdmin(admin.ModelAdmin): inlines = [UnitAttributeInline]
内容的提问来源于stack exchange,提问作者Lord Elrond
相关产品推荐
相关产品推荐

