11

निम्नलिखित पर विचार करें:Django post_save संकेत भेजता है पुराना इनलाइन formsets

class OrderForm(models.Model): 
    title = models.CharField(max_length=100) 
    desc = models.TextField() 


class OrderFormLine(models.Model): 
    order = models.ForeignKey(OrderForm) 
    lagel = models.CharField(max_length=100) 
    qty = models.IntegerField(...) 
    price = models.FloatField(...) 

अब मैं orderform विवरण के साथ एक ईमेल भेजना चाहते हैं जब भी किसी एक बनाता है या एक संशोधित करते हैं।

अब तक कोई रॉकेट विज्ञान नहीं है .. चलो बस एक post_save सिग्नल का उपयोग करें;

post_save.connect(email_notify, sender=OrderForm) 

लेकिन वहाँ एक छोटे से समस्या, OrderForm वस्तु नए डेटा के रूप में उम्मीद के साथ अद्यतन किया जाता है email_notify को पारित कर दिया है, लेकिन नहीं संबंधित OrderFormLine आइटम नहीं है।

मैंने व्यवस्थापक और मॉडल में सहेजने के तरीकों को ओवरराइड करने का प्रयास किया है, मैंने ऑब्जेक्ट, फॉर्म और उसके संबंध को मेरे अधिसूचना हैंडलर को पास करने से पहले सहेजने की कोशिश की है, कुछ भी काम नहीं करता है।

मुझे पता है कि मैं post_save सिग्नल को ऑर्डरइटम मॉडल में संलग्न कर सकता हूं, लेकिन फिर ईमेल प्रत्येक आइटम के लिए भेजा जाएगा।

सहायता मैं पागलपन के कगार पर हूं।

अद्यतन:

Found a simple and reliable solution

लघु कहानी:

def email_notify_orderform(sender, **kwargs): 
    instance = kwargs['instance'] 
    ct = ContentType.objects.get_for_model(OrderForm) 
    if ct.id == instance.content_type.id: 
     print instance.is_addition() 
     print instance.is_change() 
     print instance.is_deletion() 
     print instance.change_message 
     print instance.action_time 
     print instance.get_edited_object().total() # BINGO ! 
post_save.connect(email_notify_orderform, sender=LogEntry) 
+1

आपको अपने लाइन आइटम से संबद्ध करने के लिए एक मान्य आईडी नंबर रखने के लिए ऑर्डर फॉर्म को सहेजना होगा। मुझे लगता है कि एक कस्टम सिग्नल क्रम में है; जो आपको पागलपन से बचा सकता है। कभी-कभी, विशेष मामले बुरा नहीं होते हैं, और यह एक बहुत छोटा मामला है। "ऑर्डरफॉर्म" संकेत देता है जब यह पूरी तरह से तत्काल होता है, और आपका श्रोता post_save के बजाय इसके लिए प्रतीक्षा करता है। –

+0

मैंने कस्टम सिग्नल लिखने के बारे में कभी नहीं सुना .. और मुझे इस विषय के बारे में बहुत कुछ नहीं मिल रहा है। जो मैं समझता हूं उससे सिग्नल कसकर django में मिलते हैं और कस्टम सिग्नल प्रदान करने के लिए कोई तंत्र नहीं है। क्या यह दस्तावेज है? –

+0

कभी नहीं, डॉक्टर –

उत्तर

6

मूल समस्या है कि जब मुख्य उद्देश्य post_save संकेत भेज दिया जाता है, inlines अभी तक सहेजे नहीं गए हैं: माता-पिता मॉडल हमेशा पहले सहेजा जाता है। तो, ऐसा नहीं है कि यह पुराना डेटा भेज रहा है; वास्तव में यह डेटा की वर्तमान स्थिति है।

सबसे सरल समाधान कस्टम सिग्नल बनाना है और उस सिग्नल को उस स्थान पर भेजा गया है जहां इनलाइन सहेजे गए हैं। ModelAdmin पर विधि आपकी हुक है।

+0

जब तक कुछ ऐसा नहीं होता है तो मुझे आपके उत्तर के बारे में नहीं मिलता है, यह काम नहीं करता है। आप ब्लॉग पोस्ट में देखे गए सभी तरीकों से पोस्ट कर सकते हैं, इसमें save_formset का उपयोग करना शामिल है: http://haineault.com/blog/141/ –

+0

@ h3 क्या आपको यह विचार मिला है? यह एक लंबा समय रहा है लेकिन आप यह [पोस्ट] (http: // stackoverflow) देख सकते हैं।कॉम/प्रश्न/14858559/सेव-से-संबंधित-ऑब्जेक्ट्स-पहले-द-वास्तविक-ऑब्जेक्ट-एडिट-ऑन-डीजेंगो-एडमिन) और इसके समाधान जो [save_formset] (https: // डॉक्स के उपयोग को दर्शाते हैं। djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset)। अगर कोई इस पोस्ट पर टक्कर मारता है तो मैंने टिप्पणी छोड़ दी – raratiru

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