2010-11-19 10 views
5

Dodaję system, aby zostawić "powiadomienia" dla użytkowników, które mogą być wyświetlane przy następnym logowaniu. Stworzyłem prostą klasę powiadomień w pliku models.py. Mam tej klasy UserInfo (w tym samym models.py) do dodania w niektórych atrybutów do istniejącego systemu użytkownika Django jako część socialauth:Utwórz system powiadamiania użytkownika w 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 

Kiedy go wypróbować w konsoli skończę z tym:

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

Czego mi tu brakuje? Jestem jak Django noob, więc może to jest łatwe. Dzięki!

Odpowiedz

7

używać Django

Po pierwsze, należy rozważyć dcrodjer's answer. System wiadomości Django jest dokładnie tym, czego potrzebujesz, i dlaczego umieścić w swoim drzewie kodów coś, co dostajesz za darmo?

(Oczywiście, jeśli robisz to po prostu eksperymentować i dowiedzieć się więcej o Django, proszę kontynuować!)


każdym razie, Rozwiąż

Podsumowanie: Aby rozwiązać ten, wystarczy zmienić add_notifications do tego:

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

Uwaga dodatkowy argument (o nazwie self) w sygnaturze metody.


Dlaczego to nie działa

Jest trochę dziwactwo w wywołanie metody w Pythonie.

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

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

thisguy = Foo() 

Po wywołaniu metody bar, można użyć linię jak thisguy.bar(). Python widzi, że wywołujesz metodę na obiekcie (metoda o nazwie bar na obiekcie o nazwie thisguy). Gdy tak się stanie, Python wypełnia pierwszy argument metody samym obiektem (obiektem thisguy).

Powód, dla którego Twoja metoda nie działa, polega na tym, że wywołujesz userinfo.add_notification('you are an awesome intern!') w metodzie, która oczekuje tylko jednego argumentu. Cóż, Python wypełnił już pierwszy argument (o nazwie message) obiektem userinfo. W związku z tym Python narzeka, że ​​przekazujesz dwa argumenty do metody, która oczekuje tylko jednego.

7

Użyj ramy wiadomość Django: http://docs.djangoproject.com/en/dev/ref/contrib/messages/
Możesz umieścić userinfo zapisanych wiadomości w kolejce, jak tylko loguje się przy użyciu to:

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

Czekam na system powiadamiania, w którym powiadomienia będą się utrzymywać, dopóki nie zostaną zamknięte przez użytkownika za pośrednictwem wywołania ajax, tak jak w Stack Overflow. Czy myślisz, że wiadomości mogą to zrobić? – gohnjanotis

+0

tak ... Myślę, że wiadomości to całkiem fajna funkcja ... ja też to używam ... powinieneś rozważyć [tę odpowiedź] (http://stackoverflow.com/questions/4229044/create-user-notification-system -in-django/4229263 # 4229263). – crodjer

2

add_notification to metoda na zajęciach. Oznacza to, że niejawnie przekazuje wystąpienie klasy jako pierwszy parametr.Classes in Python

Spróbuj to zamiast:

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

Powinieneś być może aktualizować swoje pytanie jeśli szukasz uporczywego wiadomości. Może https://github.com/philomat/django-persistent-messages może pomóc zaoszczędzić czas kodowania?

+0

Utrzymywanie wiadomości to również powiadomienia na żywo. Jak w powiadomieniu pojawi się na ekranie użytkownika po jego utworzeniu? –

Powiązane problemy