【问题标题】:Django: AttributeError: 'NoneType' object has no attribute 'username'Django:AttributeError:“NoneType”对象没有属性“用户名”
【发布时间】:2021-03-30 06:11:15
【问题描述】:

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

我的模型.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 为什么因为我还没有添加任何消息。 当循环进行两次时,我注意到第一次打印了用户名,但在第二次循环中引发了错误(尽管我知道为什么它会循环,因为我什至还没有要加载的消息) like here

错误似乎也出现在我的模型类as in here的返回函数中

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

【问题讨论】:

  • .authorNone,不管你是否登录,你显然没有保存author 来引用User 对象。
  • message.author 可以为 null,访问 message.author.username 时您没有处理这种情况
  • @WillemVanOnsem 我将作者推荐给班级中的 User 和 User=get_user_model()
  • @WillemVanOnsem 知道有什么办法可以解决吗?..

标签: django attributeerror


【解决方案1】:

如果您允许不设置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)
        }

【讨论】:

  • 谢谢,但它对我不起作用......弹出同样的错误,“如果不是 self.author”语句甚至没有被执行......
  • 我做了一些更改并尝试过,所以它可以工作..但我需要在其他地方添加这个如果条件我想使用用户名
  • 是的,当然。如果你想访问某个东西的属性,你需要确保它存在于你想使用它的任何地方。将其作为模型的属性将使这更容易并避免条件的重复。
【解决方案2】:

即使您说您没有创建任何消息,您似乎也有更多消息。至少您必须使用用户名 aysha 创建了一个。带有id=1 的消息似乎没有附加用户...因此在尝试访问message.author.username 时出现错误。

Message__str__ 中添加if not self.author 不会更改任何内容,因为您访问或打印message.author.username 而不是消息。如果您print(message) 并且消息没有作者,这将有所帮助。

【讨论】:

    猜你喜欢
    • 2020-01-09
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多