在Django中创建用户通知系统

时间:2010-11-19 20:21:48

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

我正在添加一个系统,为下次登录时可以显示的用户留下“通知”。我在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 noob,所以也许这很简单。谢谢!

4 个答案:

答案 0 :(得分:9)

使用django消息框架:http://docs.djangoproject.com/en/dev/ref/contrib/messages/
您可以使用以下命令将userinfo存储的消息放入队列中:

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

答案 1 :(得分:9)

使用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看到你正在一个对象上调用一个方法(一个名为bar的对象上称为thisguy的方法。发生这种情况时,Python会使用对象本身(thisguy对象)填充方法的第一个参数。

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

答案 2 :(得分:3)

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

请改为尝试:

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

答案 3 :(得分:2)

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