Django Admin报TypeError: __str__返回非字符串(元组类型)问题求助
Django Stop模型Admin报错:__str__返回非字符串(元组类型)
你遇到的问题是Stop模型在Admin后台查看单个实例或创建新实例时触发TypeError: __str__ returned non-string (type tuple),但列表页正常、数据填充也没问题,而且修改Stop的__str__方法也没用。别光盯着Stop自己的代码,问题大概率出在关联模型或者Admin类配置上。
排查方向1:检查关联模型的__str__方法
Stop模型关联了Vehicle和Station两个外键,Admin详情页会渲染这两个关联对象的字符串表示。如果Vehicle或Station的__str__方法返回了元组而不是字符串,就会触发这个错误。
比如错误的写法:
class Vehicle(models.Model): # 其他字段... def __str__(self): return (self.id, self.vehicle_number) # 返回元组导致报错
改成正确的字符串返回:
class Vehicle(models.Model): # 其他字段... def __str__(self): return f"{self.id} - {self.vehicle_number}" # 确保返回字符串
对Station模型做同样的检查,保证它的__str__也只返回字符串。
排查方向2:检查StopAdmin的自定义配置
如果你的StopAdmin类里自定义了list_display、fields或者其他字段,有没有不小心加入了返回元组的自定义方法?
比如错误的写法:
from django.contrib import admin from .models import Stop class StopAdmin(admin.ModelAdmin): list_display = ('stop_id', 'get_platform_info') def get_platform_info(self, obj): return (obj.platform_name, obj.platform_normal) # 返回元组导致报错
改成返回字符串:
def get_platform_info(self, obj): return f"站台:{obj.platform_name}(常规站台:{obj.platform_normal})"
快速验证方法
先把Stop的__str__改成极简的固定字符串,比如:
def __str__(self): return self.stop_id
如果此时报错消失,基本可以确认是关联模型或Admin配置的问题;如果还是报错,再检查Stop模型的字段是否有异常(比如time字段是否有非datetime类型的数据,但这种情况概率极低)。
内容的提问来源于stack exchange,提问作者Gerard van Rooijen
相关产品推荐
相关产品推荐

