2013-02-13 5 views
9

Ist es möglich, die zugehörigen Objekte vor dem eigentlichen Objekt zu speichern, das auf einem django admin Formular bearbeitet wird?Speichern Sie die zugehörigen Objekte vor dem eigentlichen Objekt, das gerade bearbeitet wird. Django admin

Zum Beispiel:

in 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" 

in admin.py

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

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

admin.site.register(Parent,ParentsAdmin) 

Nun admin in django wenn ich spare ein übergeordnetes Objekt, wird es auf der Konsole ausgegeben.

Parent save 
Child save 

Ich brauche dies in Revese passieren:

Child save 
Parent save 

Antwort

9

Im Folgenden werden die Kinder zu retten. In diesem Fall ist es nicht möglich, die zugehörigen Objekte zuerst zu speichern, da kein Fremdschlüssel darauf zeigen kann. Für mich ist die folgende Erweiterung hat den Trick:

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

Je nachdem, was Sie genau in Ihre Signale tun möchten, können Sie einfach die post_save ändern für das Kindermodell pre_save?

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 Antwort brachte mich auf dem richtigen Weg, aber ich denke, dass es ein Fehler speichern Verhalten der Instanzen in Bezug auf ist, die noch nicht in der Datenbank vorhanden sind: erste

5

Ich habe Probleme mit den Antworten in diesem Beitrag ist, so dachte ich, eine kurze Antwort aus. Ich hatte ein Problem, da django-fsm verwendet wurde. Die anderen Antworten hier würden versuchen, das Modell mehrmals (einmal für jedes Formset) anstatt einmal am Ende zu speichern.

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) 

Dieser wesentliche Flips nur die Reihenfolge der save_model und save_related wie in Django ModelAdmin source

+0

nicht sicher bezeichnet, wenn dies eine Sache Django-Version ist, oder eine Business-Logik Sache, aber für Django 1.11 und meine Nutzung. Das scheint die richtige Antwort zu sein – ckot