Djangoでのユーザ通知システムを作成します。
-
26-09-2019 - |
質問
私は次回のログイン時に表示することができ、ユーザーのための「通知」を残すためにシステムを追加しています。私はmodels.pyファイルに簡単な通知のクラスを作成しました。私はsocialauthの一環として、Djangoの既存のユーザーのシステムにはいくつかの属性に追加する(同じmodels.pyに)こののUserInfoクラスを持っています:
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
私はこれで終わるコンソールでそれを試してみます:
>>> 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)
>>>
私はここで何をしないのですか?私は一種のDjangoのnoobのので、多分それは簡単なものですよ。ありがとう!
解決
使用Djangoのメッセージ
まず第一には、 dcrodjerの答えをご検討ください。 Djangoのメッセージシステムは、あなたが自由のために得ることをあなたのコードツリーの何かに入れて、なぜあなたが必要とし、正確に何ですか?
(あなただけの実験にこれを行うとDjangoについてもっと学ぶしている場合はもちろん、続けてください!)
<時間>とにかく、修正
概要:この問題を解決するには、これまで単に変更add_notifications
ます:
def add_notification(self, message):
notification = Notification(user=self.user, message=message)
notification.save
メソッドシグネチャに追加の引数(名前self
)に注意してください。
それは働いていないのはなぜ
Pythonでメソッドを呼び出すことで癖のビットがあります。
class Foo(object):
def bar(self):
print 'Calling bar'
def baz(self, shrubbery):
print 'Calling baz'
thisguy = Foo()
あなたは、メソッドbar
を呼び出すと、、あなたはthisguy.bar()
のような行を使用することができます。 Pythonは、オブジェクト(bar
と呼ばれるオブジェクトにthisguy
呼び出されるメソッド)のメソッドを呼び出していることを見ています。このような場合、Pythonはオブジェクト自体(thisguy
オブジェクト)とメソッドの最初の引数を埋める。
あなたのメソッドが動作しない理由は、引数を1つしか期待している方法にuserinfo.add_notification('you are an awesome intern!')
を呼び出しているということです。さて、Pythonはすでにmessage
オブジェクトに最初の引数(名前のuserinfo
)に充填しています。したがって、Pythonはあなただけのものを期待していることメソッドに二つの引数を渡していると文句を言います。
他のヒント
を使用するDjangoのメッセージフレームワーク: http://docs.djangoproject.com/en/dev/ REFに/ contrib /メッセージ/ の
あなたは、彼がこれを使用してログインするとすぐに、キュー内のuserinfo保存されたメッセージを入れることがあります:
messages.add_message(request, messages.INFO, 'Hello world.')
add_notificationは、クラスのメソッドです。意味することは、暗黙のうちに最初のパラメータとして、クラスのインスタンスを渡されます。 Pythonでクラスの
の代わりにこれを試してください:
class UserInfo(models.Model):
...
def add_notification(self, message):
...
あなたはおそらく、あなたの質問を更新する必要があります。たぶん、 https://github.com/philomat/django-persistent-messages にはあなたを助けることができます時間をコーディング保存しますか?