Signals को Receivers से जोड़ना
In this page:
# 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.
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.
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.
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.
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. #}
- एक receiver function define करना लेकिन इसे कभी connect न करना, या इसे एक ऐसे module में connect करना जो कभी import नहीं होता।
- एक model के save() method के अंदर signals connect करना, जो हर save पर उसी receiver को फिर से connect करता है।
- 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 करें।
Chapter Quiz — Complete all 8 topics to unlock
0/8 topics done
Complete these topics first: