質問

私は次回のログイン時に表示することができ、ユーザーのための「通知」を残すためにシステムを追加しています。私は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 にはあなたを助けることができます時間をコーディング保存しますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top