سؤال

لدي وظيفة:

def create(sender, **kw):
  [...]

التي يجب استدعاؤها عند استدعاء إشارة user_activated من تسجيل Django.

أقوم بتوصيل الإشارة والوظيفة باستخدام هذا:

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 توثيق:

لدي وظائف تستمع إلى إشارات التسجيل/التنشيط ، لكنها لا يتم استدعاؤها!

السبب الأكثر شيوعًا لذلك هو وضع تسجيل Django في دليل فرعي يقع على مسار استيراد Python الخاص بك ، بدلاً من تثبيته مباشرة على مسار الاستيراد كالمعتاد. يمكن أن يسبب الاستيراد من تسجيل Django في هذه الحالة مشكلات مختلفة ، بما في ذلك توصيل معالجات الإشارات بشكل غير صحيح. على سبيل المثال ، إذا كنت ستضع تسجيل Django داخل دليل يدعى Django_apps ، وتشير إليه بهذه الطريقة ، فسوف ينتهي بك الأمر بموقف يقوم فيه الكود الخاص بك بهذا:

from django_apps.registration.signals import user_registered

لكن تسجيل Django سيفعل:

from registration.signals import user_registered

من وجهة نظر Python ، تشير عبارات الاستيراد هذه إلى كائنين مختلفين في وحدتين مختلفتين ، وبالتالي لن يتم استدعاء معالجات الإشارات المتصلة بالإشارة من الاستيراد الأول عند إرسال الإشارة باستخدام الاستيراد الثاني.

لتجنب هذه المشكلة ، اتبع الممارسة المعيارية لتثبيت تسجيل Django مباشرة على مسار الاستيراد الخاص بك وإشارة إليها دائمًا باسم الوحدة النمطية الخاصة بها: التسجيل (وبشكل عام ، من الجيد دائمًا اتباع ممارسات Python العادية لتثبيت وتثبيت Python وتثبيتها باستخدام تطبيقات Django).

user_activated هو نفسه إشارة. لذلك عليك أن ترسل نفسها ، مع المعلمات. يتطلب ذلك وسيطتين بصرف النظر عن المرسل ، أي المستخدم ، طلب

user_activated.send(sender=Foo, user=request.user, request=request)

Foo هي فئة الواجهة الخلفية المستخدمة لتنشيط المستخدم.

هل الرمز الذي يربط طريقة معالجة الإشارات بتلك الإشارة يتم تحميلها بالتأكيد؟ (يمكنك الاختبار باستخدام إحصاء طباعة مباشرة بعد ذلك). يمكنك التأكد من تحميل معالجات الإشارات الخاصة بك لتطبيق معين من خلال استيرادها من هذا التطبيق __init__.py:

from nameofapp.nameoffilewithhandlersinit import *

ملاحظة. هل هذا خطأ مطبعي في dispatch_uid ، أم اسم متعمد؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top