13

ユーザーが次にログインしたときに表示できる「通知」を残すシステムを追加しています。models.pyファイルに単純なNotificationクラスを作成しました。このUserInfoクラス(同じmodels.py内)を使用して、socialauthの一部として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

コンソールで試してみると、次のようになります。

>>> 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初心者なので、簡単なことかもしれません。ありがとう!

4

4 に答える 4

14

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オブジェクト)を入力します。

メソッドが機能しない理由は、userinfo.add_notification('you are an awesome intern!')1つの引数のみを期待しているメソッドを呼び出しているためです。さて、Pythonはすでに最初の引数(名前付きmessage)にuserinfoオブジェクトを入力しています。したがって、Pythonは、1つだけを期待するメソッドに2つの引数を渡していると文句を言います。

于 2010-11-19T20:53:38.913 に答える
11

djangoメッセージフレームワークを使用します。http: //docs.djangoproject.com/en/dev/ref/contrib/messages/
これを使用してログインするとすぐに、userinfoに保存されているメッセージをキューに入れることができます。

messages.add_message(request, messages.INFO, 'Hello world.')
于 2010-11-19T20:26:35.333 に答える
3

add_notificationは、クラスのメソッドです。つまり、最初のパラメーターとしてクラスのインスタンスが暗黙的に渡されます。Pythonのクラス

代わりにこれを試してください:

class UserInfo(models.Model):
    ...
    def add_notification(self, message):
        ...
于 2010-11-19T20:54:04.787 に答える
2

永続的なメッセージングを探している場合は、おそらく質問を更新する必要があります。たぶんhttps://github.com/philomat/django-persistent-messagesはコーディング時間を節約するのに役立ちますか?

于 2011-01-02T10:05:49.473 に答える