django __str__ returned non-string (type Courses)

本文介绍了一种常见的Django应用开发中遇到的问题,即在admin后台管理中添加课程时出现TypeError异常,提示__str__方法返回了非字符串类型。文章详细解释了错误发生的背景,并给出了明确的解决方案。
TypeError at /admin/train/courseslist/add/
__str__ returned non-string (type Courses)


Request Method:
POST 

Request URL:
http://127.0.0.1:8000/admin/train/courseslist/add/ 

Django Version:
2.0.5 

Exception Type:
TypeError 

Exception Value:
__str__ returned non-string (type Courses)
 

Exception Location:
D:\Python36\lib\site-packages\django\contrib\admin\options.py in log_addition, line 771 

Python Executable:
D:\Python36\python.exe 

Python Version:
3.6.3 

Python Path:
['E:\\WorkPlace\\mysite',
 'E:\\WorkPlace\\mysite',
 'D:\\Python36\\python36.zip',
 'D:\\Python36\\DLLs',
 'D:\\Python36\\lib',
 'D:\\Python36',
 'D:\\Python36\\lib\\site-packages']
 

Server time:
Sun, 27 May 2018 00:05:56 +0000 


处理: 删除models.py中对应的model的__str__函数。



<think>我们正在处理一个关于DjangoAdmin的错误:当尝试删除对象时,出现"__str__ returnednon-string(typeint)"错误。这个错误的原因是:在Django模型中,我们定义了一个`__str__`方法,它应该返回一个字符串,但是实际上返回了一个整数(int)。在DjangoAdmin中,当显示对象时,会调用这个`__str__`方法。如果返回的不是字符串,就会导致错误。解决方法:确保模型的`__str__`方法返回一个字符串(str)类型。步骤:1.找到你的模型(Model)类。2.检查`__str__`方法的实现。3.确保返回值是字符串类型。如果不是,使用`str()`函数或者格式化字符串将其转换为字符串。例如,假设你的模型如下: ```pythonclass MyModel(models.Model):name= models.CharField(max_length=100)age= models.IntegerField()def __str__(self):returnself.age#错误,返回了整数```应该修改为:```pythonclassMyModel(models.Model):name =models.CharField(max_length=100)age =models.IntegerField()def__str__(self):return str(self.age)#转换为字符串```或者,如果你想要返回多个字段的组合,确保返回字符串: ```pythonclassMyModel(models.Model):name =models.CharField(max_length=100)age =models.IntegerField()def__str__(self):return f"{self.name}({self.age})"#使用f-string生成字符串```这样,在Django Admin中删除对象时就不会出现这个错误了。注意:这个错误也可能出现在其他需要字符串表示的地方,不仅仅是删除操作。参考引用:在Django官方文档中,明确要求`__str__`方法必须返回一个字符串对象[^1]。如果问题仍然存在,请检查是否还有其他模型或相关代码返回了非字符串类型。相关问题:1.如何在Django模型中正确使用`__str__`方法?2. DjangoAdmin中常见的错误有哪些?3.如何调试Django Admin中的问题?</think>### Django Admin 删除对象时出现 "__str__ returned non-string (type int)" 错误的解决方法 这个错误通常发生在 Django Admin 尝试显示要删除的对象时,模型中的 `__str__()` 方法返回了整数类型而非字符串类型。以下是完整的解决步骤: #### 解决方法 1. **定位问题模型** 在 `admin.py` 中找到注册的模型类,例如: ```python from django.contrib import admin from .models import YourModel # 替换为你的实际模型名 @admin.register(YourModel) class YourModelAdmin(admin.ModelAdmin): pass ``` 2. **修改模型的 `__str__` 方法** 打开模型文件(通常是 `models.py`),确保 `__str__` 方法 **返回字符串类型**: ```python class YourModel(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() # 示例字段 # 错误示例:返回整数类型 ↓ # def __str__(self): # return self.age # 返回了整数! # 正确修改:显式转换为字符串 ↓ def __str__(self): return str(self.age) # 使用 str() 转换 # 或返回其他字符串字段 ↓ # def __str__(self): # return self.name # 确保返回字符串 ``` **关键点**: - 使用 `str()` 包裹非字符串字段(如 `int`, `float`) - 或直接返回 `CharField`/`TextField` 等字符串字段 3. **验证修复效果** - 重新启动 Django 服务器 - 在 Admin 后台尝试删除对象,错误应消失 - 检查对象列表页的显示是否正常 #### 错误原因分析 - Django Admin 在执行删除操作时,会调用 `__str__()` 生成确认提示中的对象标识 - 当模型返回非字符串类型(如整数)时,触发 `TypeError` - 常见于返回主键 ID 或数值字段未转换的情况: ```python def __str__(self): return self.id # ❌ 主键 ID 是整数类型 ``` #### 预防建议 1. **始终验证返回值类型** 在 `__str__` 中使用类型检查: ```python def __str__(self): value = f"{self.name}-{self.age}" assert isinstance(value, str), "__str__ must return string" return value ``` 2. **使用格式化字符串 (f-string)** 自动处理类型转换: ```python def __str__(self): return f"{self.id}: {self.name}" # 自动将 id(int) 转为 str ``` 3. **重写 Admin 的确认提示** 如果仍需保留原始数据类型,可自定义删除确认模板: ```python class YourModelAdmin(admin.ModelAdmin): def get_deleted_objects(self, objs, request): # 自定义对象显示逻辑 return [str(obj.id) for obj in objs], {}, set(), [] ``` 参考 Django 文档 [自定义 Admin 行为](https://docs.djangoproject.com/en/stable/ref/contrib/admin/actions/#django.contrib.admin.ModelAdmin.get_deleted_objects)[^1] #### 常见关联问题场景 - 当模型包含 `ForeignKey` 时,确保关联对象的 `__str__` 也返回字符串 - 使用 `@property` 计算字段时需显式转换类型: ```python class Product(models.Model): price = models.DecimalField(max_digits=10, decimal_places=2) @property def tax_included(self): return self.price * 1.1 # 返回 Decimal 类型 def __str__(self): return f"{self.name} - {str(self.tax_included)}" # 必须转换 ``` > **提示**:此错误可能影响所有对象操作界面(不仅是删除),建议全面检查模型定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值