2010-11-19 32 views
5

Estoy agregando un sistema para dejar "notificaciones" para los usuarios que se pueden mostrar la próxima vez que inicien sesión. Creé una clase de notificación simple 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:Crear sistema de notificación de usuario en 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 

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é es lo que falta aquí? Soy un novato de Django, así que tal vez sea algo fácil. ¡Gracias!

Respuesta

7

Uso de Django

En primer lugar, tenga en cuenta dcrodjer's answer. El sistema de mensajes de Django es exactamente lo que necesita, y ¿por qué poner en su árbol de códigos algo que 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 todos modos, una solución

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

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

Nota del argumento adicional (llamado self) en la firma del método.


¿Por qué no está funcionando

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, puede utilizar una línea como thisguy.bar(). Python ve que estás llamando a un método en un objeto (un método llamado bar en un objeto llamado thisguy). Cuando esto sucede, Python completa el primer argumento del método con el objeto mismo (el objeto thisguy).

El motivo por el que su método no funciona es que está llamando al userinfo.add_notification('you are an awesome intern!') en un método que solo espera un argumento. Bueno, Python ya completó el primer argumento (llamado message) con el objeto userinfo. Por lo tanto, Python se queja de que está pasando dos argumentos a un método que solo espera uno.

7

utilizar el marco mensaje de Django: http://docs.djangoproject.com/en/dev/ref/contrib/messages/
Usted puede poner el userinfo mensajes almacenados en la cola tan pronto como se registra en el uso de este:

mensajes
messages.add_message(request, messages.INFO, 'Hello world.') 
+2

Estoy buscando tener un sistema de notificación donde las notificaciones persisten hasta que son cerradas por un usuario a través de una llamada ajax, algo así como en Stack Overflow. ¿Crees que los mensajes pueden hacer esto? – gohnjanotis

+0

sí ... supongo que los mensajes son una característica bastante agradable ... yo también lo uso ... debes considerar [esta respuesta] (http://stackoverflow.com/questions/4229044/create-user-notification-system -in-django/4229263 # 4229263). – crodjer

2

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

Tal vez puedas probar:

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

tal vez 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 a ahorrar tiempo de codificación?

+0

¿Los mensajes persistentes también significan notificaciones en vivo? Como en la notificación aparecerá en la pantalla del usuario después de que se crea? –

Cuestiones relacionadas