Django自带的admin后台管理系统修改字段时报错:TypeError: __str__ returned non-string (type NoneType)

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),可能是这个模型关联的字段造成的。

这个模型类关联了另外两个模型类UserInfoArticles

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后台就不报错了!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值