Вопрос

Я добавляю систему, чтобы оставить «уведомления» для пользователей, которые могут отображаться в следующий раз, когда они входятся в систему. Я создал простой класс уведомлений в файле 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. может помочь вам сохранить время кодирования?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top