57

我有这段代码可以创建一个新注释..当我尝试打印时,即使它打印输出,我也会收到以下错误

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)

笔记.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)
4

8 回答 8

91

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

def __str__(self):
    return 'Memo={0}, Tag={1}'.format(self.memo, self.tags)
于 2012-08-08T18:54:04.057 回答
55

你也可以用 str() 包围输出。我遇到了同样的问题,因为我的模型具有以下内容(作为简化示例):

def __str__(self):
    return self.pressid

其中 pressid 是一个 IntegerField 类型的对象。Django(和一般的python)需要一个字符串作为str函数,所以返回一个整数会导致这个错误被抛出。

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

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

于 2015-02-11T18:46:43.633 回答
11

您面临的问题是: TypeError : str returned non-string (type NoneType)

这里你必须了解str函数的工作原理:str函数虽然主要用于打印值,但实际上旨在返回一个字符串,而不是打印一个。在您的类str函数中直接调用 print 而它没有返回任何内容,这解释了您的错误输出。由于我们的格式化字符串是构建的,并且由于我们的函数没有返回任何内容,因此使用 None 值。这是您的错误的解释

您可以通过使用str函数中的 return 来解决这个问题,例如: *simply returnig 字符串值而不是打印它

 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)
            `
于 2018-08-22T07:13:09.033 回答
0

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

def __str__(self):
    return self.code

str 正在等待一个 str,而不是另一个。

现在可以很好地使用:

def __str__(self):
    return self.name

其中名称是一个字符串。

于 2021-01-17T01:34:57.610 回答
0

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

于 2021-07-20T14:15:14.090 回答
0

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

我的情况是,某天(没有记忆)将某些字段(备忘录)的属性更改(添加)为 null=True。但我完全忘记了我的model.py如下。

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

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

于 2021-03-12T12:25:08.183 回答
0

试试这个:

def __str__(self):
    return f'Memo={self.memo}, Tag={self.tags}'
于 2021-01-05T00:21:57.687 回答
0

在模型的__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)
于 2022-01-08T11:34:02.690 回答