2011-01-27 7 views
5

मैं सोच रहा हूं कि ऑब्जेक्ट सृजन पर एक Django सिग्नल (जैसे post_save या post_init) चुनिंदा रूप से दबाने के लिए संभव है, या वैकल्पिक रूप से, इसे कुछ पैरामीटर भेजें।क्या Django में post_save (या अन्य) सिग्नल को चुनिंदा रूप से दबाना संभव है?

मेरे पास User ऑब्जेक्ट है, जिसे मेरे कोड में कई अलग-अलग तरीकों और स्थानों में बनाया जा सकता है। इसलिए प्रत्येक User पर कस्टम Profile ऑब्जेक्ट स्वचालित रूप से असाइन करने के लिए, मैं post_save सिग्नल का उपयोग करता हूं। हालांकि, एक विशिष्ट मामले में, अतिरिक्त जानकारी है जिसे मैं बनाए गए Profile ऑब्जेक्ट से जोड़ना चाहता हूं। इसे post_save सिग्नल के तर्क के रूप में पास करना बहुत अच्छा होगा, लेकिन यह संभव नहीं दिखता है।

अन्य विकल्प मैन्युअल Profile वस्तु बनाने के लिए है, लेकिन फिर मैं उस के बाद User सहेजा जाता है, अन्यथा Profile एक User उदाहरण के लिए बाध्य नहीं किया जा सकता की जरूरत है। उदाहरण के लिए, User उदाहरण सहेजना, सिग्नल द्वारा बुलाए गए फ़ंक्शन के माध्यम से अन्य Profile को बनाया जा रहा है।

और मुझे सिर्फ Profile ऑब्जेक्ट नहीं मिला है, क्योंकि इसके परिणामस्वरूप 'Profile' object is unsubscriptable त्रुटि होती है। कोई सलाह?

अद्यतन:

def createUserProfile(sender, instance, created, **kwargs): 
if created: 
    profile, created = Profile.objects.get_or_create(user=instance) 
    if extra_param: 
     profile.extra_param = extra_param 
    profile.save() 

post_save.connect(createUserProfile, sender=User) 

def signup(request): 
    ... 
    extra_param = 'param' 
    user.save() 

मैं कैसे createUserProfile विधि है, जहां यह संग्रहीत करने के लिए है करने के लिए signup विधि में चर extra_param मिलता है:

यहाँ एक संभव स्थिति का एक उदाहरण है Profile ऑब्जेक्ट के हिस्से के रूप में?

+1

+1। मुझे इसका जवाब जानना अच्छा लगेगा। – PeanutButterJelly

उत्तर

2

यह आपके लिए क्यों काम नहीं करता है?

user = User(...) 
user.save() 
# profile has been created transparently by post_save event 
profile = user.profile 
profile.extra_stuff = '...' 
profile.save() 

आप मापदंडों घटना, संभव है, लेकिन बुराई को पारित करने से ग्रस्त रहे हैं:

user = User() 
user._evil_extra_args = { ... } 
user.save() 

In event: 
extra_args = getattr(user, '_evil_extra_args', False) 

यह बुराई है, क्योंकि लोग हैं, जो अपने कोड पढ़ा जाएगा पता नहीं है क्या बिल्ली उन _evil_extra_args के लिए है और होगा यह कैसे काम करता है।

+3

मैं अंत में बुरा विकल्प के साथ गया, क्योंकि पहला व्यक्ति किसी प्रकार की समरूपता त्रुटि देता है (डीबी ऑब्जेक्ट अभी भी 'सेव()' ईवेंट से लॉक होता है जब मैं एक्सेस करने का प्रयास करता हूं प्रोफ़ाइल)। –

0

देरी post_save संभव नहीं है (जब तक आप entirely disconnect it नहीं चाहते), लेकिन न ही यह आवश्यक है। प्रोफाइल में पैरामीटर पास करना कोई समस्या नहीं है:

class UserProfile(models.Model): 
    user = models.ForeignKey(User) 
    other = models.SomeField() 

def create_user_profile(sender, instance, created, other_param=None, **kwargs): 
    if created: 
     profile, created = UserProfile.objects.get_or_create(user=instance) 
     profile.other(other_param) # or whatever 
     profile.save() 

post_save.connect(create_user_profile, sender=User, other_param=p) 
+0

क्या होगा यदि मैं केवल एक मामले में उस पैरामीटर को भेजना चाहता हूं, और 'post_save.connect' को' उपयोगकर्ता 'ऑब्जेक्ट बनाने वाले फ़ंक्शन के अलावा कहीं और परिभाषित किया गया है? यह कैसे काम करेगा? –

+0

बस इसे एक डिफ़ॉल्ट मान दें ... (संपादित उत्तर) –

+0

मुझे लगता है कि हम में से एक दूसरे को गलत समझ रहा है, इसलिए मैंने अपने प्रश्न के लिए एक उदाहरण जोड़ा जो उम्मीद से समस्या को स्पष्ट करेगा। –

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