Django-Registration信号の接続
-
26-09-2019 - |
質問
機能があります:
def create(sender, **kw):
[...]
これは、Django-Registrationからのuser_activated信号が呼び出された場合に呼び出されます。
これを使用して信号と関数を接続します。
from registration.signals import user_activated
[...]
post_save.connect(create, sender=user_activated, dispatch_uid="users-atactivation-signal")
ただし、ユーザーがアクティベーションリンクをクリックすると、電子メールで受け取ったときに関数は呼び出されません。
ここで何が恋しいですか。
解決
このような関数:
def create(sender, user, request, **kwarg):
[...]
そして、このような接続呼び出し:
user_activated.connect(create)
仕事はします。私は私のsignals.pyファイルにこれらを持っています。
他のヒント
django-registrationアプリが実際にインストールされていなかったが、信号のためにリッスンするコードが適切に呼び出されないプロジェクトにコピーされただけです。
Django-Registration V0.8から ドキュメンテーション:
登録/アクティベーション信号を聞く関数がありますが、呼び出されていません!
これの最も一般的な原因は、通常のようにインポートパスに直接インストールするのではなく、PythonインポートパスにあるサブディレクトリにDjango-Registrationを配置することです。その場合のDjango-Registrationからのインポートは、信号ハンドラーを誤って接続するなど、さまざまな問題を引き起こす可能性があります。たとえば、django_appsという名前のディレクトリ内にdjango-registrationを配置し、そのように参照する場合、コードがこれを行う状況になります。
from django_apps.registration.signals import user_registered
しかし、Django-Registrationは次のようになります。
from registration.signals import user_registered
Pythonの観点から、これらのインポートステートメントは2つの異なるモジュールの2つの異なるオブジェクトを参照するため、2番目のインポートを使用して信号を送信した場合、最初のインポートから信号に接続された信号ハンドラーは呼び出されません。
この問題を回避するために、インポートパスに直接Django-Registrationをインストールする標準的な慣行に従ってください。独自のモジュール名で常に参照してください。 Djangoアプリケーションの使用)。
user_activated
それ自体は信号です。したがって、パラメーターを使用して自分自身を送信する必要があります。送信者、つまりユーザー、リクエストを除いて2つの引数が必要です
user_activated.send(sender=Foo, user=request.user, request=request)
Foo
バックエンドクラスは、ユーザーをアクティブにするために使用されます。
信号処理方法をその信号に接続するコードは間違いなくロードされていますか? (その直後に印刷局でテストすることができます)。特定のアプリをそのアプリからインポートして、特定のアプリの信号ハンドラーをロードすることを確認できます __init__.py
:
from nameofapp.nameoffilewithhandlersinit import *
詩それはDispatch_uidのタイプミスですか、それとも意図的な名前ですか?