2013-02-13 61 views
9

पर वास्तविक ऑब्जेक्ट को संपादित करने से पहले संबंधित ऑब्जेक्ट्स को सहेजें, क्या डीजेंगो एडमिन फॉर्म पर वास्तविक ऑब्जेक्ट को संपादित करने से पहले संबंधित ऑब्जेक्ट्स को सहेजना संभव है?django admin

उदाहरण के लिए:

models.py

class Parent(model.Model): 
    pass 

class Child(model.Model): 
    parent = models.ForeignKey(Parent) 

@receiver(post_save,sender = Parent) 
def notify_parent_save(sender, instance=None, **kwargs): 
    print "Parent save" 

@receiver(post_save,sender = Child) 
def notify_child_save(sender, instance=None, **kwargs): 
    print "Child saved" 

में admin.py

class ChildInline(admin.TabularInline): 
    model = Child 
    extra = 1 

class ParentsAdmin(admin.ModelAdmin): 
    inlines = [ChildInline] 

admin.site.register(Parent,ParentsAdmin) 

में अब, Django व्यवस्थापक में अगर मैं एक माता पिता वस्तु बचाने के लिए, यह कंसोल पर उत्पादन होगा।

Parent save 
Child save 

मैं इस revese क्रम में होने की जरूरत है:

Child save 
Parent save 

उत्तर

9

निम्नलिखित बच्चों पहला बचत होगी:

class ParentAdmin(admin.ModelAdmin): 
    inlines = [ChildInline] 

    def save_model(self, request, obj, form, change): 
     pass # don't actually save the parent instance 

    def save_formset(self, request, form, formset, change): 
     formset.save() # this will save the children 
     form.instance.save() # form.instance is the parent 
0

, आप बिल्कुल अपने संकेतों में क्या करना चाहते हैं क्या पर निर्भर करता है तुम सिर्फ post_save बाल मॉडल के लिए pre_save को बदल सकते हैं?

3

ccrisan का जवाब मुझे सही रास्ते पर लाया है, लेकिन मुझे लगता है कि अभी तक उदाहरणों डेटाबेस में मौजूद नहीं है के व्यवहार को बचाने के बारे में एक दोष है। इस मामले में पहले संबंधित वस्तुओं को सहेजना संभव नहीं है, क्योंकि कोई विदेशी कुंजी नहीं है जिसे वे इंगित कर सकते हैं। मेरे लिए निम्न एक्सटेंशन चाल किया:

class ParentAdmin(admin.ModelAdmin): 
    inlines = [ChildInline] 

    def save_model(self, request, obj, form, change): 
     if not obj.pk: # call super method if object has no primary key 
      super(ParentAdmin, self).save_model(request, obj, form, change) 
     else: 
      pass # don't actually save the parent instance 

    def save_formset(self, request, form, formset, change): 
     formset.save() # this will save the children 
     form.instance.save() # form.instance is the parent 
5

मैं इस पोस्ट में जवाब के साथ मुद्दों कर रहा था, तो मैं अधिक संक्षिप्त जवाब पता लगा। मुझे कोई समस्या हो रही थी क्योंकि django-fsm का उपयोग करके, अन्य उत्तर यहां अंत में एक बार मॉडल को कई बार (प्रत्येक फॉर्मेट के लिए) सहेजने का प्रयास करेंगे।

def save_model(self, request, obj, form, change): 
    if not obj.pk: # call super method if object has no primary key 
     super(YourAdmin, self).save_model(request, obj, form, change) 
    else: 
     pass # don't actually save the parent instance 

def save_related(self, request, form, formsets, change): 
    form.save_m2m() 
    for formset in formsets: 
     self.save_formset(request, form, formset, change=change) 
    super(YourAdmin, self).save_model(request, form.instance, form, change) 

यह आवश्यक सिर्फ save_model के आदेश flips और के रूप में Django ModelAdmin source

+0

यकीन नहीं अगर यह एक Django संस्करण बात है, या एक व्यापार तर्क बात है में कहा जाता save_related, लेकिन Django 1.11 और मेरे उपयोग के लिए। यह सही जवाब प्रतीत होता है – ckot