Pregunta

añado un sistema para salir de "notificaciones" para los usuarios que se pueden mostrar la próxima vez que se conecten. He creado una clase simple notificación en el archivo models.py. Tengo esta clase de información del usuario (en el mismo models.py) para añadir en algunos atributos al sistema de usuario existente de Django como parte de 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

Cuando lo intento en la consola termino con esto:

>>> 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)
>>> 

¿Qué me estoy perdiendo aquí? Soy una especie de un novato Django así que quizás es algo fácil. Gracias!

¿Fue útil?

Solución

mensajes Uso de Django

En primer lugar, por favor considere de dcrodjer respuesta . El sistema de mensajes de Django es exactamente lo que necesita, y por qué poner en su árbol de código algo que se obtiene de forma gratuita?

(Por supuesto, si usted está haciendo esto sólo para experimentar y aprender más acerca de Django, por favor continúe!)


De todas formas, una solución

Resumen: Para solucionar este problema, simplemente el cambio add_notifications a esto:

    def add_notification(self, message):
        notification = Notification(user=self.user, message=message)
        notification.save

Tenga en cuenta el argumento adicional (llamado self) en la firma del método.


¿Por qué no funciona

Hay un poco de una peculiaridad en llamar a métodos en Python.

class Foo(object):
    def bar(self):
        print 'Calling bar'

    def baz(self, shrubbery):
        print 'Calling baz'

thisguy = Foo()

Cuando se llama al método bar, se puede usar una línea como thisguy.bar(). Python ve que usted está llamando a un método en un objeto (un método llamado bar en un objeto llamado thisguy). Cuando esto sucede, Python llena en el primer argumento del método con el objeto mismo (el objeto thisguy).

La razón por la que su método no funciona es que está llamando userinfo.add_notification('you are an awesome intern!') en un método que sólo está esperando un argumento. Bueno, Python ya se ha llenado en el primer argumento (llamado message) con el objeto userinfo. De este modo, Python se queja de que estás pasando dos argumentos a un método que sólo espera una.

Otros consejos

El uso del marco mensaje de Django: http://docs.djangoproject.com/en/dev/ ref / contrib / mensajes /
Es posible poner el userinfo mensajes almacenados en la cola tan pronto como se registra en el uso de lo siguiente:

messages.add_message(request, messages.INFO, 'Hello world.')

add_notification es un método en una clase. Eso significa que implícitamente se pasa la instancia de la clase como el primer parámetro. Clases en Python

Pruebe esto en su lugar:

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

quizá debería actualizar su pregunta si usted está buscando para la mensajería persistente. Tal vez https://github.com/philomat/django-persistent-messages puede ayudarle ahorrar tiempo de codificación?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top