首页 > 解决方案 > Django:AttributeError:“NoneType”对象没有属性“用户名”

问题描述

我正在尝试创建一个聊天应用程序并遇到此错误。尽管我以超级用户身份登录,但我收到此错误。

我的模型.py

class Message(models.Model):
    author = models.ForeignKey(User, null=True, related_name='author_messages', on_delete=models.CASCADE)
    content = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.author.username

    def last_10_messages():
        return Message.objects.order_by('-timestamp').all()[:10]

我尝试访问它的地方:

for message in messages:
            print("message printing")
            result.append(self.message_to_json(message))

然后

def message_to_json(self, message):
        print("message.id=",message.id)
        print(message.author.username)
        return {
            'id': message.id,
            'author': message.author.username,
            'content': message.content,
            'timestamp': str(message.timestamp)
        }

当我打印对象的长度时,我注意到它说 2..idk 为什么我还没有添加任何消息。当循环进行两次时,我注意到第一次打印了用户名,但在第二次循环中引发了错误(尽管我知道为什么它会循环,因为我什至还没有要加载的消息) 就像这里

该错误似乎也出现在我的模型类的返回函数中,如此处

我读过其他帖子,但他们的错误是不同的......如果 sum1 cud 提供帮助将非常感激!
或者我如何以正确的方式定义和访问作者变量

标签: djangoattributeerror

解决方案


如果您允许author不设置,那么您需要在尝试使用它之前确保它已设置。

像这样有点防守;

class Message(models.Model):
    author = models.ForeignKey(User, null=True, related_name='author_messages', on_delete=models.CASCADE)
    content = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        if not self.author:
            return "Anonymous"
        return self.author.username

    def last_10_messages():
        return Message.objects.order_by('-timestamp').all()[:10]
    def message_to_json(self, message):
        if message.author:
            author = message.author.username
        else:
            author = "Anonymous"

        return {
            'id': message.id,
            'author': author,
            'content': message.content,
            'timestamp': str(message.timestamp)
        }


推荐阅读