2013-02-13 26 views
9

İlgili nesneleri django yönetici formunda düzenlenecek gerçek nesneden önce kaydetmek mümkün mü? Örneğinİlgili nesneleri django admin üzerinde düzenlenmeden önce kaydetme

:

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

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

admin.site.register(Parent,ParentsAdmin) 

admin.py yılında

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" 

models.py Şimdi, Django admin ben konsolda çıktısı, bir üst nesnenin kaydederseniz.

Parent save 
Child save 

bu revese sırayla gerçekleşmesi gerekir:

Child save 
Parent save 

cevap

9

şu ilk çocukları kurtaracak. Bu durumda, önce ilgili nesneleri kaydetmek mümkün değildir, çünkü işaret edebilecekleri yabancı bir anahtar yoktur. Benim için aşağıdaki uzatma hile yaptı: bu yazı cevapları ile sorunlar yaşıyordu

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 
0

sadece Çocuk modeli için pre_save için post_save değiştirebilir, tam olarak sinyallere yapmak istediğinize bağlı?

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 
3

ccrisan cevabı doğru yolda beni getirdi, ama henüz veritabanında bulunmayan durumlarda davranışı tasarrufu konusunda kusur olduğunu düşünüyorum:

5

, bu yüzden bir daha öz cevap anladım. Bir sorun yaşadım çünkü django-fsm kullanıyorum, buradaki diğer cevaplar modeli bir defada değil defalarca (her form kümesi için bir kez) kurtarmaya çalışacaktı.

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) 

Bu temel sadece save_model sıralamasını ters çevirir ve Django ModelAdmin source

+0

bu Django sürümü şey ya da bir iş mantığı şey olup olmadığından emin değil denilen olarak save_related fakat Django 1.11 ve benim kullanım için. Bu doğru cevap gibi görünüyor – ckot