2010-08-19 12 views
6

मैं एक डीजेंगो प्रोजेक्ट पर काम कर रहा हूं, जहां मैं एक संकेत लागू करना चाहता हूं जिसे कुछ उपयोगकर्ता पता बदल दिया जाना चाहिए। मैंने अंतर्निहित सिग्नल देखे हैं लेकिन वे मेरे मामले में काम नहीं कर रहे हैं, क्योंकि अगर मैं सहेजने का उपयोग करता हूं जिसे अन्य सहेजने की घटनाओं में भी बुलाया जाएगा और हालांकि मैं एक कस्टम सिग्नल बनाने में सक्षम हूं, तो मुझे पता नहीं चला , मुझे यह कैसे कॉल करना चाहिए?उपयोगकर्ता विवरण अद्यतन के लिए django सिग्नल बनाना

कृपया सुझाव दें।

अग्रिम धन्यवाद।

उत्तर

16

कस्टम सिग्नल को परिभाषित करके प्रारंभ करें। यहां एक कस्टम सिग्नल django.dispatch.Signal का उप वर्ग है। यह कोड app/signals.py में रह सकता है।

from django.dispatch import Signal 
user_address_changed = Signal(providing_args=["user"]) 

अगला, सुनिश्चित करें कि आप इस सिग्नल को भेजते हैं जब आपका उपयोगकर्ता का पता बदल जाता है। User और Address को परिभाषित करने के आधार पर यह विभिन्न स्थानों पर किया जा सकता है। आइए मान लें कि एक ऐसा दृश्य है जो उपयोगकर्ताओं को उनके Address मॉडल अपडेट करने देता है। यह कोड संभवतः app/views.py में है।

from app import signals 

def update_address(request, *args, **kwargs): 
    # all the changes go well. 
    signals.user_address_changed.send(sender=None, user=request.user) 
    # Render to template etc. 

अब आपको इस सिग्नल के लिए रिसीवर सेट अप करने की आवश्यकता है।

from app.signals import user_address_changed 

def handle_user_address_change(sender, **kwargs): 
    """Trap the signal and do whatever is needed""" 
    user = kwargs['user'] 
    # Write to log, update db, send mail etc. 

user_address_changed.connect(handle_user_address_change) 

अद्यतन

(टिप्पणी को पढ़ने के बाद, ओपी बताते हैं कोई अलग राय यह है कि अद्यतन को संबोधित है कि वहाँ) उस मामले में आप इस संकेत भेजने के लिए User.save() ओवरराइड करने के लिए कोशिश कर सकते हैं। मैं कहता हूं "कोशिश करें" क्योंकि मुझे नहीं पता कि आप अपने User कक्षा या auth.User का उपयोग कर रहे हैं या नहीं।

+0

धन्यवाद, यह एक सामने के अंत उपयोगकर्ता के अपडेट के लिए ठीक काम करेगा। लेकिन अगर हम व्यवस्थापक पैनल के माध्यम से पता बदलते हैं, तो इस दृश्य को नहीं कहा जाएगा और इसलिए यह संकेत नहीं भेजा जाएगा। –

+0

अद्यतन उत्तर। ऊपर देखो। –

+0

यह उपयोगकर्ता के साथ एक विदेशी मॉडल के रूप में एक अलग मॉडल है .. तो मुझे लगता है कि इस मामले में User.save() संभव नहीं है? –

1

आप Django-signalqueue सराहना हो सकता है:

https://github.com/fish2000/django-signalqueue

यह स्टॉक संकेत डिस्पैचर है कि एक AsyncSignal वर्ग प्रदान करता है के लिए एक विस्तार है। AsyncSignal कॉलबैक को एक अलग कार्यकर्ता धागे पर निष्पादित किया जा सकता है - आप परिभाषित एसिंक्रोनस श्रोताओं के विशिष्ट व्यवहार को नियंत्रित कर सकते हैं।

(पूर्ण प्रकटीकरण:। मैं इसे लिखा था) आपके उत्तर मनोज के लिए

संबंधित मुद्दे