1.出错地方
在登录django自带的admin管理后台进行添加数据或者修改数据时报错
TypeError: str returned non-string (type NoneType)
2.错误原因
django的模型类中定义了__str__方法,而__str__方法需要进行返回一个字符串格式的数据(注:这里我看其他博主都强调了只能使用return)
class Comment(models.Model):
nid = models.AutoField(primary_key=True)
digg_count = models.IntegerField(verbose_name='点赞', default=0)
article = models.ForeignKey(verbose_name='评论文章', to='Articles', to_field='nid', on_delete=models.CASCADE)
user = models.ForeignKey(verbose_name='评论者', to='UserInfo', to_field='nid', on_delete=models.CASCADE, null=True)
content = models.TextField(verbose_name='评论内容')
comment_count = models.IntegerField(verbose_name='子评论数', default=0)
drawing = models.TextField(verbose_name='配图', null=True, blank=True)
create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
parent_comment = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE,
verbose_name='是否是父评论')
# 就是这里一直报错
def __str__(self):
return self.content
class Meta:
verbose_name_plural = '评论'
3. 解决方法
在百度上找了好久,都是直接说这里self.content需要是字符串或者不能为空才行,但是我通过print打印后就是字符串类型且有数据,所以一直解决不了。。。
后续在Chat-GPT上说有可能是这个模型的关联字段出现了错误,即,TypeError: __str__ returned non-string (type NoneType),可能是这个模型关联的字段造成的。
这个模型类关联了另外两个模型类UserInfo和Articles。
在UserInfo模型类中的我是继承了django中自带的用户模型,它里面自带的用户类,在其中我也找到了他的__str__方法
我的UserInfo类继承了AbstractUser类,而AbstractUser类又继承了AbstractBaseUser类,在AbstractBaseUser类中有一个__str__方法,所以也不是这个问题
class AbstractBaseUser(models.Model):
password = models.CharField(_('password'), max_length=128)
last_login = models.DateTimeField(_('last login'), blank=True, null=True)
is_active = True
REQUIRED_FIELDS = []
# Stores the raw password if set_password() is called so that it can
# be passed to password_changed() after the model is saved.
_password = None
class Meta:
abstract = True
# 这里有一个__str__方法
def __str__(self):
return self.get_username()
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if self._password is not None:
password_validation.password_changed(self._password, self)
self._password = None
那么就是另一个Articles类,但是通过print打印后也是有数据且为字符串类型。
直到我发现UserInfo类又关联了Avatars模型类,他的__str__方法出现了错误,因为它的返回值可能为空
修改前
class Avatars(models.Model):
nid = models.AutoField(primary_key=True)
url = models.FileField(verbose_name='用户头像地址', upload_to='avatars/')
def __str__(self):
return str(self.url)
class Meta:
verbose_name_plural = '用户头像'
修改后
class Avatars(models.Model):
nid = models.AutoField(primary_key=True)
url = models.FileField(verbose_name='用户头像地址', upload_to='avatars/')
def __str__(self):
if self.url:
return str(self.url)
else:
return ""
然后在登录admin后台就不报错了!!