4

ドキュメントを読んだ後、

https://docs.djangoproject.com/en/dev/topics/signals/

私は自分のsignals.pyファイルにこれを作成しました:

from django.db.models.signals import post_save
from django.dispatch import receiver
from models import User

from models import Story

@receiver(post_save, sender=User)
def create_initial_story(sender,instance, signal, created, **kwargs):
    print "helloooo!"
    if created:
        Story(user = instance, title = 'Random Stories', description="Random stories", is_closed = False, is_random = True).save()

私が読んだことから、メッセージを送信するために必要だと思ったのはこれだけでした。さて、それと新しいユーザーを作成します(私はdjango-registrationフレームワークを使用します)しかし、何も送信されていません(まあ、私が持っているレシーバーメソッドは何もしません)。また、@receiverアノテーションの「sender=User」パラメーターを削除しました。

@receiver(post_save)

しかし、それは問題を助けませんでした。コンソールに何も出力されず、新しいデータは保存されません...ユーザーが保存されたときにユーザーから信号を送信する必要がありますか?もしそうなら、私はそれをどのように行いますか?私はdjango-registrationを使用しているので、UserProfileを定義しています...つまり、どこで(どのファイル/メソッドで)シグナルを送信するようにユーザーに指示しますか?

4

3 に答える 3

9

signals.pyどこかにインポートして実行する必要があります。たとえばmodels.py

于 2012-05-24T13:54:52.087 に答える
6

まず、それらは「デコレータ」と呼ばれます。アノテーションはDjangoの他の何かなので、そこでの用語を混同しないようにするのが最善です。

post_saveシグナルは、その名前が示すように、保存するたびに呼び出されます。指定すると、受信者はその特定のモデルの保存のために送信される信号senderのみに制限されます。省略した場合、post_saveモデルが保存されたときにレシーバーが呼び出されますが、これは確かに希望するものではありません。

ここでのあなたの問題は、すべての意図と目的のために、あなたの受信機が存在しないということです。Djangoは自動的にインポートしないsignals.pyため、表示されることはありません。それを表示する唯一の方法は、models.py(@DrTyrsaなど)が示唆するように、Djangoが参照する場所にインポートすることです。

ただし、これを行うと、models.pyをsignals.pyに既にインポートしているため、循環インポートエラーが発生します。したがって、シグナルコードをmodels.pyに直接配置するか、別の場所を見つけてインポートすることができます。__init__.pyうまくいくかもしれませんが、私は通常、常に自分のシグナルをmodels.pyに入れて、それを1日と呼びます。

于 2012-05-24T14:24:56.370 に答える
0

または、これを使用できます:

from django.db.models.signals import post_save
于 2020-07-12T17:05:43.087 に答える