Django:如何在Admin中显示外键关联对象的名称属性?
解决Django Admin中显示艺术家名称而非ID的问题
首先,先修正你模型里的一个小错误:models.IntField() 应该是 models.IntegerField(),不然运行时会抛出错误哦。
接下来分两部分解决你的核心问题:
1. 让创建/编辑画作时的艺术家下拉框显示名称
Django 默认会用模型的 __str__ 方法来渲染 ForeignKey 选项的显示文本。你只需要给 Artist 模型添加这个方法,就能替换掉默认的「对象[ID]」格式:
class Artist(models.Model): name = models.CharField(max_length=120) age = models.IntegerField() # 修正IntField为正确的IntegerField def __str__(self): return self.name # 返回艺术家名称,作为模型实例的字符串标识
添加之后,你在Admin里创建或编辑画作时,艺术家的下拉选项就会直接显示具体的名称,而不是枯燥的ID标识了。
2. 在Admin列表中显示艺术家名称(解决list_display的问题)
你直接写 artist = Artist.name 是不符合Django规则的,list_display 支持两种方式来显示关联字段内容:
方式一:用双下划线关联字段
直接在 list_display 里使用 artist__name,Django会自动关联查询艺术家的名称:
from django.contrib import admin from .models import Artist, Paintings class PaintingsAdmin(admin.ModelAdmin): list_display = ('painting_name', 'artist__name') # 通过双下划线关联艺术家名称字段 admin.site.register(Artist) admin.site.register(Paintings, PaintingsAdmin)
方式二:自定义方法实现更灵活的显示
如果需要额外的显示逻辑(比如同时展示名称和年龄),可以自定义一个方法:
class PaintingsAdmin(admin.ModelAdmin): list_display = ('painting_name', 'get_artist_info') def get_artist_info(self, obj): return f"{obj.artist.name}({obj.artist.age}岁)" # 自定义显示内容 get_artist_info.short_description = '艺术家信息' # 设置列表表头的名称
这样在画作的Admin列表页,就能清晰看到对应的艺术家信息了。
内容的提问来源于stack exchange,提问作者Dariun
相关产品推荐
相关产品推荐

