我有这段代码创建一个新笔记..我尝试打印我得到以下错误,即使它打印输出
Error:
C:\Python27\Basics\OOP\formytesting>python notebook.py
Memo=This is my first memo, Tag=example
Traceback (most recent call last):
File "notebook.py", line 14, in <module>
print(firstnote)
TypeError: __str__ returned non-string (type NoneType)
note.py
import datetime
class Note:
def __init__(self, memo, tags):
self.memo = memo
self.tags = tags
self.creation_date = datetime.date.today()
def __str__(self):
print('Memo={0}, Tag={1}').format(self.memo, self.tags)
if __name__ == "__main__":
firstnote = Note('This is my first memo','example')
print(firstnote)
答案 0 :(得分:68)
方法__str__应该返回字符串,而不是打印。
def __str__(self):
return 'Memo={0}, Tag={1}'.format(self.memo, self.tags)
答案 1 :(得分:28)
您也可以用str()包围输出。我遇到了同样的问题,因为我的模型有以下内容(作为简化示例):
def __str__(self):
return self.pressid
其中pressid是IntegerField类型对象。 Django(以及一般的python)需要一个 str 函数的字符串,因此返回一个整数会导致抛出此错误。
def __str__(self):
return str(self.pressid)
这解决了我在Django管理方面遇到的问题。希望它对你的帮助。
答案 2 :(得分:3)
您面临的问题是: TypeError: str 返回了非字符串(类型为NoneType)
在这里您必须了解 str 函数的工作原理: str 功能,尽管通常用于打印值,但实际上旨在返回一个字符串,而不是打印一个字符串。 在您的类中, str 函数在不返回任何内容的情况下直接调用print,这解释了您的错误输出。由于构建了格式化的字符串,并且由于我们的函数未返回任何内容,因此使用None值。 这是对您的错误的解释
您可以使用 str 函数中的return来解决此问题,例如: *仅返回字符串值,而不是打印
class Summary(models.Model):
book = models.ForeignKey(Book,on_delete = models.CASCADE)
summary = models.TextField(max_length=600)
def __str__(self):
return self.summary
但是,如果您要返回的值不是字符串类型,则可以这样操作,以从 str 函数返回字符串值
*类型将值转换为 str 函数返回的字符串
class Summary(models.Model):
book = models.ForeignKey(Book,on_delete = models.CASCADE)
summary = models.TextField(max_length=600)
def __str__(self):
return str(self.summary)
`
答案 3 :(得分:0)
试试这个:
def __str__(self):
return f'Memo={self.memo}, Tag={self.tags}'
答案 4 :(得分:0)
我遇到了同样的问题,就我而言,是因为我返回了一个数字:
def __str__(self):
return self.code
str 正在等待一个 str,而不是另一个。
现在可以很好地与:
def __str__(self):
return self.name
其中 name 是一个字符串。
答案 5 :(得分:0)
我是 Django 的新手。 但我分享我的经验,因为解决了同样的案例。
我的情况是,某天(没有记忆)将某些字段(备忘录)的属性更改(添加)为 null=True。但我完全忘记了我的model.py如下。
def __str__(self):
if self is not None:
return self.author.memo
所以我将返回值编辑为其他字段。仅此而已。
答案 6 :(得分:0)
您的表中可能有一些空值。进入mysql并删除表中的空值。