Django Admin中admin.py内的__str__()无法正常工作吗?
Django Admin中定义
__str__()无法正常工作的原因及解决方法 问题场景复现
当在Model层定义__str__()时,Admin后台的Change List页面能正常显示实体的全名:
# models.py from django.db import models class Person(models.Model): first_name = models.CharField(max_length=20) last_name = models.CharField(max_length=20) def __str__(self): return self.first_name + " " + self.last_name
对应的Admin配置代码:
# admin.py from django.contrib import admin from .models import Person @admin.register(Person) class PersonAdmin(admin.ModelAdmin): pass
此时Change List页面的操作消息和实体列表都会正常显示全名。
但如果在Admin类中定义__str__(),无论是否将其加入list_display配置,都无法正常显示全名:
情况1:仅在Admin类中定义__str__()
# admin.py from django.contrib import admin from .models import Person @admin.register(Person) class PersonAdmin(admin.ModelAdmin): def __str__(self): return self.first_name + " " + self.last_name
情况2:Admin类中定义__str__()并加入list_display
# admin.py from django.contrib import admin from .models import Person @admin.register(Person) class PersonAdmin(admin.ModelAdmin): list_display = ('__str__',) def __str__(self): return self.first_name + " " + self.last_name
以上两种场景下,Change List页面都无法正确显示全名。
核心原因
Django的__str__()方法是属于Model实例的核心方法,用于定义实体的字符串表示形式;而Admin类只是Model在后台的配置类,它的__str__()方法不会被用来渲染Model实体的展示文本:
- 当你在Admin类中定义
__str__(),这个方法属于PersonAdmin的实例,而非Person模型实例。后台渲染时,仍然会调用Model本身的__str__()方法(若Model未定义则显示默认的<Person object (id)>格式)。 - 配置
list_display = ('__str__',)时,Django会优先寻找Model实例的__str__()方法,而非Admin类的同名方法,因此Admin类里的定义不会生效。
正确实现方式
如果需要自定义Admin后台的实体显示文本,有两种标准做法:
- 全局生效(推荐):在Model层定义
__str__(),这是Django的标准规范,不仅在Admin后台生效,其他任何调用Model实例字符串表示的场景都会生效。 - 仅Admin后台生效:在Admin类中定义自定义方法,再将其加入
list_display配置:
# admin.py from django.contrib import admin from .models import Person @admin.register(Person) class PersonAdmin(admin.ModelAdmin): list_display = ('full_name',) def full_name(self, obj): return f"{obj.first_name} {obj.last_name}" # 可选:给列表列设置友好显示名称 full_name.short_description = "全名"
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

