← Back to Django Course | Chapter 12: Signals & Middleware | Lesson 4 of 8

Signals को Receivers से जोड़ना

एक receiver connect करना bell को किसी का phone number देने जैसा है ताकि इसे पता हो कि बजने पर किसे call करना है।
Syntax
markup
# Decorator
@receiver(signal_name, sender=ModelName)
def handler_name(sender, **kwargs):
    ...

# Manual connect
signal_name.connect(handler_name, sender=ModelName)

एक Receiver Connect करने के दो तरीके

आप एक receiver को @receiver decorator से connect कर सकते हैं, या सीधे signal.connect(func, sender=Model) call करके — दोनों वही चीज़ करते हैं।

उदाहरण: Two Ways to Connect a Receiver

You can connect a receiver with the @receiver decorator, or by calling signal.connect(func, sender=Model) directly — both do the same thing.

markup
from django.dispatch import receiver
from django.db.models.signals import post_delete
from .models import Comment

@receiver(post_delete, sender=Comment)
def log_delete(sender, instance, **kwargs):
    print(f"Comment {instance.pk} deleted")

# Equivalent without the decorator:
# post_delete.connect(log_delete, sender=Comment)
{# Django-only code -- models.py/views.py/urls.py/settings.py snippets, or template markup using Django template tags/variables -- can't run standalone via Judge0 or the browser preview, since it needs a real Django project. Only this course's pure-Python examples (example_lang == 'python', no Django imports) are actually runnable, so those still get the button below. #}

यह सुनिश्चित करना कि Receivers Register हो जाएं

एक receiver सिर्फ तब काम करता है जब Python असल में उस module को import करे जिसमें यह defined है। इसे करने की standard जगह AppConfig.ready() है, जिसे Django startup पर एक बार call करता है।

उदाहरण: Making Sure Receivers Get Registered

A receiver only works if Python actually imports the module it's defined in. The standard place to do this is AppConfig.ready(), which Django calls once at startup.

markup
from django.apps import AppConfig

class BlogConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "blog"

    def ready(self):
        import blog.signals
{# Django-only code -- models.py/views.py/urls.py/settings.py snippets, or template markup using Django template tags/variables -- can't run standalone via Judge0 or the browser preview, since it needs a real Django project. Only this course's pure-Python examples (example_lang == 'python', no Django imports) are actually runnable, so those still get the button below. #}

उसी Receiver को कई Senders से Connect करना

एक receiver function एक से ज़्यादा models से connected हो सकता है, या तो connect() कई बार call करके या senders की एक list के ऊपर loop करके।

उदाहरण: Connecting the Same Receiver to Multiple Senders

One receiver function can be connected to more than one model, either by calling connect() several times or looping over a list of senders.

markup
from django.db.models.signals import post_save
from .models import Article, Comment

def log_save(sender, instance, **kwargs):
    print(f"{sender.__name__} saved")

for model in (Article, Comment):
    post_save.connect(log_save, sender=model)
{# Django-only code -- models.py/views.py/urls.py/settings.py snippets, or template markup using Django template tags/variables -- can't run standalone via Judge0 or the browser preview, since it needs a real Django project. Only this course's pure-Python examples (example_lang == 'python', no Django imports) are actually runnable, so those still get the button below. #}

एक Receiver Disconnect करना

Receivers को signal.disconnect() से हटाया जा सकता है, जो mainly tests में उपयोगी है जहां आप temporarily एक side effect को silence करना चाहते हैं।

उदाहरण: Disconnecting a Receiver

Receivers can be removed with signal.disconnect(), which is mainly useful in tests where you want to temporarily silence a side effect.

markup
from django.db.models.signals import post_save
from .signals import log_save
from .models import Article

post_save.disconnect(log_save, sender=Article)
{# Django-only code -- models.py/views.py/urls.py/settings.py snippets, or template markup using Django template tags/variables -- can't run standalone via Judge0 or the browser preview, since it needs a real Django project. Only this course's pure-Python examples (example_lang == 'python', no Django imports) are actually runnable, so those still get the button below. #}
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. एक receiver function define करना लेकिन इसे कभी connect न करना, या इसे एक ऐसे module में connect करना जो कभी import नहीं होता।
  2. एक model के save() method के अंदर signals connect करना, जो हर save पर उसी receiver को फिर से connect करता है।
  3. Receiver scope करने के लिए sender= उपयोग न करना, जो इसे project के हर model के लिए चलने का कारण बनता है।
चैप्टर सारांश
  • एक receiver बस एक matching signature वाला normal Python function है।
  • इसे connect करने के लिए @receiver(signal, sender=Model) या signal.connect(func, sender=Model) उपयोग करें।
  • Signal receivers को Django द्वारा असल में register होने के लिए कहीं import किया जाना चाहिए, आमतौर पर AppConfig.ready() के through।
  • Unrelated models पर unexpected side effects से बचने के लिए receivers को एक specific sender तक scope करें।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.