Создать систему уведомлений пользователя в Django
-
26-09-2019 - |
Вопрос
Я добавляю систему, чтобы оставить «уведомления» для пользователей, которые могут отображаться в следующий раз, когда они входятся в систему. Я создал простой класс уведомлений в файле Models.py. У меня есть этот класс UserInfo (в том же моделям .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
Во-первых, пожалуйста, рассмотрите Ответ Дкроджер. Отказ Система сообщений 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 жалуется, что вы передаете два аргумента методу, который ожидает только один.
Другие советы
Используйте структуру сообщений Django: http://docs.djangoProject.com/en/dev/ref/Contrib/messages/
Вы можете поставить пользовательфовые сохраненные сообщения в очереди, как только он входит в систему, используя это:
messages.add_message(request, messages.INFO, 'Hello world.')
ADD_Notification - это метод в классе. Это означает, что он неявно пропускает экземпляр класса в качестве первого параметра. Классы в Python
Попробуйте это вместо этого:
class UserInfo(models.Model):
...
def add_notification(self, message):
...
Возможно, вы должны обновить свой вопрос, если вы ищете постоянные сообщения. Может быть https://github.com/philomat/django-persstent-messages. может помочь вам сохранить время кодирования?