5

J'ajoute un système pour laisser des "notifications" aux utilisateurs qui peuvent être affichés la prochaine fois qu'ils se connectent. J'ai créé une simple classe Notification dans le fichier models.py. J'ai cette classe UserInfo (dans le même models.py) pour ajouter des attributs au système utilisateur existant de Django dans le cadre de socialauth:Créer un système de notification utilisateur dans 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 

Quand je l'essayer dans la console je me retrouve avec ceci:

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

Que manque-t-il ici? Je suis un peu un Django noob alors peut-être que c'est quelque chose de facile. Merci!

Répondre

7

Utilisez les messages Django

Tout d'abord, s'il vous plaît envisager dcrodjer's answer. Le système de messagerie Django est exactement ce dont vous avez besoin, et pourquoi mettre dans votre arbre de code quelque chose que vous obtenez gratuitement?

(Bien sûr, si vous faites cela juste pour expérimenter et apprendre plus sur Django, s'il vous plaît continuer!)


Quoi qu'il en soit, une solution

Résumé: Pour résoudre ce problème, tout changement add_notifications à ceci:

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

Notez le argument supplémentaire (appelé self) dans la signature de la méthode.


Pourquoi cela ne fonctionne pas

Il y a un peu d'une bizarrerie dans l'appel de méthodes en Python.

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

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

thisguy = Foo() 

Lorsque vous appelez la méthode bar, vous pouvez utiliser une ligne comme thisguy.bar(). Python voit que vous appelez une méthode sur un objet (une méthode appelée bar sur un objet appelé thisguy). Lorsque cela se produit, Python remplit le premier argument de la méthode avec l'objet lui-même (l'objet thisguy).

La raison pour laquelle votre méthode ne fonctionne pas est que vous appelez userinfo.add_notification('you are an awesome intern!') sur une méthode qui n'attend qu'un seul argument. Eh bien, Python a déjà rempli le premier argument (nommé message) avec l'objet userinfo. Ainsi, Python se plaint que vous passez deux arguments à une méthode qui n'en attend qu'un seul.

7

Utilisez le cadre de message django: http://docs.djangoproject.com/en/dev/ref/contrib/messages/
Vous pouvez mettre les userinfo messages stockés dans la file d'attente dès qu'il se connecte en utilisant ceci:

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

Je cherche à avoir un système de notification où les notifications persistent jusqu'à ce qu'elles soient fermées par un utilisateur via un appel ajax, un peu comme sur Stack Overflow. Pensez-vous que les messages peuvent le faire? – gohnjanotis

+0

ouais ... je suppose que les messages est une fonctionnalité assez agréable ... je aussi l'utiliser ... vous devriez considérer [cette réponse] (http://stackoverflow.com/questions/4229044/create-user-notification-system -in-django/4229263 # 4229263). – crodjer

2

add_notification est une méthode sur une classe. Cela signifie qu'il a implicitement passé l'instance de la classe en tant que premier paramètre.Classes in Python

Essayez ceci:

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

Vous devriez peut-être mettre à jour votre question si vous êtes à la recherche de la messagerie persistante. Peut-être https://github.com/philomat/django-persistent-messages peut vous aider à économiser du temps de codage?

+0

La messagerie persistante signifie également les notifications en direct. Comme dans la notification apparaîtra sur l'écran de l'utilisateur après sa création? –

Questions connexes