13

我正在添加一个系统来为用户留下“通知”,以便在他们下次登录时显示。我在 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 菜鸟,所以也许这很容易。谢谢!

4

4 回答 4

14

使用 Django 消息

首先,请考虑dcrodjer 的回答。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)。thisguy发生这种情况时,Python 用对象本身(对象)填充方法的第一个参数。

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

于 2010-11-19T20:53:38.913 回答
11

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

messages.add_message(request, messages.INFO, 'Hello world.')
于 2010-11-19T20:26:35.333 回答
3

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

试试这个:

class UserInfo(models.Model):
    ...
    def add_notification(self, message):
        ...
于 2010-11-19T20:54:04.787 回答
2

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

于 2011-01-02T10:05:49.473 回答