2010-11-19 10 views
5

Sto aggiungendo un sistema per lasciare "notifiche" per gli utenti che possono essere visualizzati al prossimo accesso. Ho creato una semplice classe di notifica nel file models.py. Ho questa classe UserInfo (nella stessa models.py) per aggiungere su alcuni attributi al sistema degli utenti esistente Django come parte di socialauth:Crea sistema di notifica utente in 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 

Quando provo fuori nella console io alla fine con questo:

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

Cosa mi manca qui? Sono una specie di noob di Django quindi forse è qualcosa di facile. Grazie!

risposta

7

Usa Django

Prima di tutto, perche dcrodjer's answer. Il sistema di messaggi Django è esattamente ciò di cui hai bisogno e perché inserire nell'albero del codice qualcosa che si ottiene gratuitamente?

(Naturalmente, se si sta facendo questo solo per sperimentare e imparare di più su Django, vi prego di continuare!)


In ogni caso, una correzione

Riassunto: Per risolvere questo problema, basta cambiare add_notifications a questo:

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

Nota l'argomento supplementare (chiamato self) nella firma del metodo.


Perché non funziona

C'è un po 'di un capriccio di chiamare i metodi in Python.

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

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

thisguy = Foo() 

Quando si chiama il metodo bar, è possibile utilizzare una linea come thisguy.bar(). Python vede che stai chiamando un metodo su un oggetto (un metodo chiamato bar su un oggetto chiamato thisguy). Quando ciò accade, Python compila il primo argomento del metodo con l'oggetto stesso (l'oggetto thisguy).

Il motivo per cui il metodo non funziona è che si sta chiamando userinfo.add_notification('you are an awesome intern!') su un metodo che prevede solo un argomento. Bene, Python ha già inserito il primo argomento (chiamato message) con l'oggetto userinfo. Quindi, Python si lamenta che stai passando due argomenti a un metodo che si aspetta solo uno.

7

utilizzare il framework messaggio django: http://docs.djangoproject.com/en/dev/ref/contrib/messages/
puoi mettere l'userinfo messaggi memorizzati nella coda non appena registra nell'uso di questo:

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

Sto cercando di avere un sistema di notifica in cui le notifiche persistono fino a quando non vengono chiuse da un utente tramite una chiamata Ajax, un po 'come su Stack Overflow. Pensi che i messaggi possano farlo? – gohnjanotis

+0

sì ... immagino che i messaggi siano una bella caratteristica ... anch'io la uso ... dovresti considerare [questa risposta] (http://stackoverflow.com/questions/4229044/create-user-notification-system -in-django/4229263 # 4229263). – crodjer

2

add_notification è un metodo su una classe. Ciò significa che viene implicitamente passato l'istanza della classe come primo parametro.Classes in Python

Prova a modificare:

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

Si dovrebbe forse aggiornare la tua domanda se siete alla ricerca per la messaggistica persistente. Forse https://github.com/philomat/django-persistent-messages può aiutarti a risparmiare tempo per la codifica?

+0

La messaggistica persistente indica anche le notifiche in tempo reale. Come nella notifica comparirà sullo schermo dell'utente dopo che è stato creato? –