Django Admin面板报错:__str__返回非字符串(NoneType)原因排查
这个TypeError的核心是某个模型的__str__方法返回了None而非字符串,结合你的场景和Notification模型代码,可能的原因分为两个方向:
1. Notification模型自身的__str__存在问题
Django Admin在展示模型实例时会自动调用__str__方法生成显示名称。如果你的Notification模型定义过类似下面的__str__(你提供的代码未包含这部分),就会触发错误:
def __str__(self): return self.text_preview # 或返回self.remarks
因为text_preview和remarks都是允许为空的字段(blank=True),当id=5的通知实例中这两个字段都为空时,self.text_preview会返回None,直接返回就会导致__str__返回非字符串类型。
如果你的Notification模型完全没定义__str__,Django默认会返回类似<Notification object (5)>的字符串,一般不会触发这个错误,所以优先排查是否存在自定义的__str__方法。
2. 关联模型的__str__方法返回了None
你的Notification模型关联了多个外键(incident_report、incident_remarks、sender、user、responder),Admin加载编辑页面时会展示这些关联对象的名称,也就是调用它们的__str__方法。如果其中某个关联模型(比如IncidentGeneral、IncidentRemark或User)的__str__方法返回了None,编辑id=5的通知时就会触发报错。
比如假设IncidentGeneral的__str__是这样写的:
def __str__(self): return self.title # 若该字段为None
当id=5的通知关联的incident_report实例中title为空时,调用__str__就会返回None,进而触发这个类型错误。
内容的提问来源于stack exchange,提问作者kimski

