Создать систему уведомлений пользователей в Django - PullRequest
8 голосов
/ 19 ноября 2010

Я добавляю систему, чтобы оставить «уведомления» для пользователей, которые могут отображаться при следующем входе в систему. Я создал простой класс Notification в файле models.py.У меня есть этот класс UserInfo (в том же models.py) для добавления некоторых атрибутов к существующей пользовательской системе Django в рамках socialauth:

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 ]

10 голосов
/ 19 ноября 2010

Использовать сообщения Django

Прежде всего, рассмотрите ответ dcrodjer's .Система сообщений 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 жалуется, что вы передаете два аргумента методу, который ожидает только один.

10 голосов
/ 19 ноября 2010

Использовать структуру сообщений django: http://docs.djangoproject.com/en/dev/ref/contrib/messages/
Вы можете поместить сохраненные сообщения userinfo в очередь, как только он войдет в систему, используя это:

messages.add_message(request, messages.INFO, 'Hello world.')
3 голосов
/ 19 ноября 2010

add_notification - это метод класса.Это означает, что он неявно получает экземпляр класса в качестве первого параметра. Классы на Python

Попробуйте вместо этого:

class UserInfo(models.Model):
    ...
    def add_notification(self, message):
        ...
2 голосов
/ 02 января 2011

Возможно, вам следует обновить свой вопрос, если вы ищете постоянный обмен сообщениями.Может быть, https://github.com/philomat/django-persistent-messages поможет вам сэкономить время кодирования?

...