Python:「TypeError:__str__返回非字符串」但仍然输出到控制台。

62
我有一段代码,用于创建一个新的笔记。当我尝试打印时,尽管它能够输出结果,但是会出现以下错误:
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)
 
    
9个回答

100

方法 __str__ 应该返回字符串而不是打印。

def __str__(self):
    return 'Memo={0}, Tag={1}'.format(self.memo, self.tags)

57
您也可以使用 str() 将输出括起来。我之前也遇到过同样的问题,因为我的模型有如下代码(以简化示例为例):
def __str__(self):
    return self.pressid

在这里,pressid是一个IntegerField类型的对象。Django(以及Python通常)期望str函数返回字符串,因此返回整数会导致引发错误。

def __str__(self):
    return str(self.pressid)

那解决了我在 Django 管理方面遇到的问题。希望它对你有所帮助。


这就是我需要的!如何将这个答案保存以备将来参考...>??? - flowera

16

你遇到的问题是: TypeError: str返回了非字符串类型(NoneType)

在这里,你需要理解str函数的工作方式: str函数虽然通常用于打印值,但实际上是设计用来返回一个字符串,而不是打印一个字符串。 在你的类中,str函数直接调用打印功能,而没有返回任何值,这就解释了你的错误输出。由于我们的格式化字符串已经构建好了,而且由于我们的函数没有返回任何值,因此使用了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
在模型的__str__方法中,你返回了一个null值。
例如:
class X(models.Model):
    name = models.CharField(_('Name'), null=True, blank=True, 
    max_length=150)
    date_of_birth = models.DateField(_('Date of birth'), null=True, blank=True)
    street = models.CharField(_('Street'), max_length=150, blank=True)
    
    def __str__(self):
        return self.name # here the value of name field might be null, so the 

错误正在显示。
正确的 __str__ 方法应该是:
def __str__(self):
    return str(self.name)

0

我遇到了同样的问题,我的情况是因为我返回了一个数字:

def __str__(self):
    return self.code

str正在等待一个str,而不是其他的。

现在可以正常工作:

def __str__(self):
    return self.name

其中name是一个字符串。


0

我是Django的新手。但我想分享我的经验,因为我解决了同样的问题。

我的情况是这样的,有一天(不记得了)我将某些字段(memo)的属性更改为null=True。但我完全忘记了我的model.py如下所示。

def __str__(self):
    if self is not None:
        return self.author.memo

所以我将返回值编辑为其他字段。就这样。


0
你的表格可能有一些空值。进入mysql并删除表格中的空值。

0
我在Django管理界面中遇到了与下面相同的错误:
TypeError: str返回了非字符串(NoneType类型)
当我定义了一个接受None值的name字段,然后在Django管理界面中保存了一个None值时,就会出现这个错误。
# "models.py"

class Person(models.Model):                            # Here
    name = models.CharField(max_length=20, blank=True, null=True)

    def __str__(self):
        return self.name

所以,我用下面的代码将 self.name 替换为 str(self.name),然后错误就解决了:

# "models.py"

class Person(models.Model):
    name = models.CharField(max_length=20, blank=True, null=True)

    def __str__(self):
        return str(self.name) # Here

0

试试这个:

def __str__(self):
    return f'Memo={self.memo}, Tag={self.tags}'

没有必要在 f-string 周围放置 str 构造函数(从定义上来说,它已经是一个 str)。 - ShadowRanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接