जब Django 1.7 जारी किया गया था तो यह दस्तावेज़ में जोड़ा गया था:
कड़ाई से बोलना, सिग्नल हैंडलिंग और पंजीकरण कोड आप की तरह कहीं भी रह सकते हैं, हालांकि यह आयात कोड के साइड-इफेक्ट को कम करने के लिए एप्लिकेशन के रूट मॉड्यूल और इसके मॉडल मॉड्यूल से बचने के लिए अनुशंसित है।
व्यवहार में, सिग्नल हैंडलर आमतौर पर उस एप्लिकेशन के संकेतों में परिभाषित किए जाते हैं जो वे संबंधित हैं। सिग्नल रिसीवर आपके एप्लिकेशन कॉन्फ़िगरेशन क्लास के तैयार () तरीके से जुड़े हुए हैं। यदि आप रिसीवर () डेकोरेटर का उपयोग कर रहे हैं, तो बस तैयार () के अंदर सिग्नल सबमॉड्यूल आयात करें।
Django 1.7 में परिवर्तित: चूंकि तैयार () Django के पिछले संस्करणों में मौजूद नहीं था, आमतौर पर मॉडल मॉड्यूल में सिग्नल पंजीकरण हुआ।
सबसे अच्छा अभ्यास एक सिग्नल सबमॉड्यूल में अपने हैंडलर को हैंडलरस्टॉक में परिभाषित करना है, उदाहरण के लिए एक फ़ाइल जो दिखता है:
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 में है । यह इस तरह दिखेगा:
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 को अपनी सेटिंग में सीधे या तो अपने सेटिंग्स के 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 / सिग्नल / हैंडलरस्टॉक में परिभाषित करें) लेकिन AppConfig का उपयोग करने के बजाय, आप __init__.py के माध्यम से हैंडलर लोड करेंगे आपका एप्लिकेशन, जैसे कुछ:
yourapp / __ init__.py
import signals
यह तैयार () विधि का उपयोग करने के रूप में अच्छा नहीं है क्योंकि यह अक्सर परिपत्र आयात मुद्दों का कारण बनता है।