Django models 在Django中创建用户通知系统

Django models 在Django中创建用户通知系统,django-models,django-authentication,django-socialauth,Django Models,Django Authentication,Django Socialauth,我正在添加一个为用户留下“通知”的系统,这些通知可以在用户下次登录时显示。我在models.py文件中创建了一个简单的通知类。我有一个UserInfo类(在相同的models.py中)作为socialauth的一部分添加到Django的现有用户系统中: class UserInfo(models.Model): user = models.OneToOneField(User, unique=True) ... reputation = models.IntegerFie

我正在添加一个为用户留下“通知”的系统,这些通知可以在用户下次登录时显示。我在models.py文件中创建了一个简单的通知类。我有一个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)
>>> 
>user=user.objects.get(id=14)
>>>user.userinfo.add_通知('你是个很棒的实习生!')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:add_notification()正好接受1个参数(给定2个)
>>> 

我错过了什么?我有点像Django noob,所以也许这很简单。谢谢

使用django消息框架:
用户登录后,您可以使用以下方法将userinfo存储的消息放入队列:

messages.add_message(request, messages.INFO, 'Hello world.')
使用Django消息 首先,请考虑一下。Django消息系统正是您所需要的,为什么要将免费获得的东西放在代码树中呢

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


不管怎样,一个补丁 小结:要解决此问题,只需将
添加\u通知
更改为:

    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
时,可以使用类似于
thisguie.bar()的行。Python看到您正在对一个对象调用一个方法(对一个名为
thisgue
的对象调用一个名为
bar
的方法)。当这种情况发生时,Python会用对象本身(thisgue
对象)填充方法的第一个参数


你的方法不起作用的原因是,你在一个只需要一个参数的方法上调用了
userinfo.add\u notification('你是一个很棒的实习生!')
。Python已经用
userinfo
对象填充了第一个参数(名为
message
)。因此,Python抱怨说,您正在将两个参数传递给一个只需要一个参数的方法。

add\u notification是类上的一个方法。这意味着它隐式地将类的实例作为第一个参数传递

请尝试以下方法:

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

如果您正在寻找持久消息,您可能应该更新您的问题。也许可以帮你节省编码时间

我希望有一个通知系统,在这个系统中,通知会一直保存到用户通过ajax调用关闭它们为止,有点像堆栈溢出。你认为消息能做到这一点吗?是的…我猜消息是一个很好的特点…我也使用它…你应该考虑。持久消息也意味着实时通知。如中所示,在创建通知后,该通知是否会在用户屏幕上弹出?