【问题标题】:Create user notification system in Django在 Django 中创建用户通知系统
【发布时间】:2011-05-12 20:35:32
【问题描述】:

我正在添加一个系统,为用户留下“通知”,以便他们下次登录时显示。我在 models.py 文件中创建了一个简单的 Notification 类。我有这个 UserInfo 类(在同一个 models.py 中)作为 socialauth 的一部分向 Django 的现有用户系统添加一些属性:

class UserInfo(models.Model):
    user = models.OneToOneField(User, unique=True)
    ...
    reputation = models.IntegerField(null=True, blank=True)

    def add_notification(message):
        notification = Notification(user=self.user, message=message)
        notification.save

当我在控制台中尝试时,我得到了这样的结果:

>>> user = User.objects.get(id=14)
>>> user.userinfo.add_notification('you are an awesome intern!')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: add_notification() takes exactly 1 argument (2 given)
>>> 

我在这里缺少什么?我是一个 Django 菜鸟,所以也许这很容易。谢谢!

【问题讨论】:

    标签: django-models django-authentication django-socialauth


    【解决方案1】:

    如果您正在寻找持久消息,您或许应该更新您的问题。也许https://github.com/philomat/django-persistent-messages 可以帮助您节省编码时间?

    【讨论】:

    • 持久消息是否也意味着实时通知。因为通知会在创建后在用户的屏幕上弹出?
    【解决方案2】:

    add_notification 是一个类的方法。这意味着它隐式地将类的实例作为第一个参数传递。 Classes in Python

    试试这个:

    class UserInfo(models.Model):
        ...
        def add_notification(self, message):
            ...
    

    【讨论】:

      【解决方案3】:

      使用 Django 消息

      首先,请考虑dcrodjer's answer。 Django 消息系统正是您所需要的,为什么要在您的代码树中放入您免费获得的东西?

      (当然,如果您这样做只是为了试验和了解更多关于 Django 的信息,请继续!)


      无论如何,修复

      总结:要解决这个问题,只需将add_notifications 更改为:

          def add_notification(self, message):
              notification = Notification(user=self.user, message=message)
              notification.save
      

      注意方法签名中的附加参数(名为self)。


      为什么它不起作用

      在 Python 中调用方法有点怪癖。

      class Foo(object):
          def bar(self):
              print 'Calling bar'
      
          def baz(self, shrubbery):
              print 'Calling baz'
      
      thisguy = Foo()
      

      调用bar方法时,可以使用thisguy.bar()这样的行。 Python 看到您正在调用一个对象上的方法(在一个名为 thisguy 的对象上调用一个名为 bar 的方法)。发生这种情况时,Python 用对象本身(thisguy 对象)填充方法的第一个参数。

      你的方法不起作用的原因是你在一个只需要一个参数的方法上调用userinfo.add_notification('you are an awesome intern!')。好吧,Python 已经用userinfo 对象填充了第一个参数(名为message)。因此,Python 抱怨您将两个参数传递给一个只需要一个参数的方法。

      【讨论】:

        【解决方案4】:

        使用 django 消息框架:http://docs.djangoproject.com/en/dev/ref/contrib/messages/
        您可以在他登录后立即将用户信息存储的消息放入队列中:

        messages.add_message(request, messages.INFO, 'Hello world.')
        

        【讨论】:

        • 我希望有一个通知系统,通知会一直持续到用户通过 ajax 调用关闭它们,就像在 Stack Overflow 上一样。你认为消息可以做到这一点吗?
        • 是的...我猜消息是一个非常不错的功能...我也使用它...你应该考虑this answer
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-19
        • 2012-03-23
        • 2014-01-30
        相关资源
        最近更新 更多