สิ่งนี้ถูกเพิ่มไปยังเอกสารเมื่อDjango 1.7เปิดตัว:
การพูดอย่างเคร่งครัดการจัดการสัญญาณและรหัสการลงทะเบียนสามารถอยู่ได้ทุกที่ที่คุณต้องการแม้ว่าจะแนะนำให้หลีกเลี่ยงโมดูลรูทของแอปพลิเคชันและโมดูลโมเดลเพื่อลดผลข้างเคียงของการนำเข้ารหัส
ในทางปฏิบัติตัวจัดการสัญญาณมักถูกกำหนดไว้ในสัญญาณ submodule ของแอปพลิเคชันที่เกี่ยวข้อง ตัวรับสัญญาณเชื่อมต่ออยู่ในวิธีการพร้อม () ของคลาสการกำหนดค่าแอปพลิเคชันของคุณ หากคุณกำลังใช้ตัวรับสัญญาณ () มัณฑนากรเพียงนำเข้าสัญญาณ submodule ภายในพร้อม ()
เปลี่ยนเป็น Django 1.7: เนื่องจาก ready () ไม่มีอยู่ใน Django เวอร์ชันก่อนหน้าการลงทะเบียนสัญญาณมักจะเกิดขึ้นในโมดูลโมเดล
วิธีปฏิบัติที่ดีที่สุดคือการกำหนดตัวจัดการของคุณในตัวจัดการ.pyในการส่งสัญญาณสัญญาณเช่นไฟล์ที่มีลักษณะดังนี้:
yourapp / สัญญาณ / ตัวจัดการไฟล์ :
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel
@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
pass
สถานที่ที่ดีที่สุดในการลงทะเบียนจัดการสัญญาณของคุณอยู่แล้วใน AppConfig ของ app ที่กำหนดมันใช้พร้อม ()วิธีการ จะมีลักษณะเช่นนี้:
yourapp / apps.py :
from django.apps import AppConfig
class TasksConfig(AppConfig):
name = 'tasks'
verbose_name = "Tasks"
def ready(self):
import yourproject.yourapp.signals.handlers #noqa
ตรวจสอบให้แน่ใจว่าคุณกำลังโหลด AppConfig ของคุณด้วยการระบุไว้โดยตรงใน settings.py ของ INSTALLED_APPS ของคุณโดยตรงหรือใน__init__
แอปของคุณ ดูเอกสารพร้อม ()สำหรับข้อมูลเพิ่มเติม
หมายเหตุ:หากคุณกำลังส่งสัญญาณให้แอปอื่นฟังเช่นกันให้ใส่ไว้ใน__init__
โมดูลสัญญาณของคุณเช่นไฟล์ที่มีลักษณะดังนี้:
yourapp / สัญญาณ / __ init__.py
import django.dispatch
task_generate_pre_save = django.dispatch.Signal(providing_args=["task"])
from yourapp.signals import task_generate_pre_save
แอปอื่นแล้วสามารถฟังสัญญาณของคุณโดยการนำเข้าและการลงทะเบียนเช่น การแยกสัญญาณของคุณออกจากเครื่องจัดการทำให้ทุกอย่างสะอาดอยู่เสมอ
คำแนะนำสำหรับ Django 1.6:
หากคุณยังติดอยู่ที่ Django 1.6 หรือต่ำกว่านั้นคุณต้องทำสิ่งเดียวกัน (กำหนดตัวจัดการของคุณใน yourapp / signal / tires.py) แต่แทนที่จะใช้ AppConfig คุณจะโหลดตัวจัดการผ่านทาง __init__.py ของ แอปของคุณเช่นบางสิ่งเช่น:
yourapp / __ init__.py
import signals
วิธีนี้ไม่ดีเท่าการใช้วิธี ready () เพราะมักทำให้เกิดปัญหาการนำเข้าแบบวงกลม