You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实体的展示文本:

  1. 当你在Admin类中定义__str__(),这个方法属于PersonAdmin的实例,而非Person模型实例。后台渲染时,仍然会调用Model本身的__str__()方法(若Model未定义则显示默认的<Person object (id)>格式)。
  2. 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:50:32