2013-02-13 13 views
9

È possibile salvare gli oggetti correlati prima che l'oggetto reale venga modificato su un modulo admin django?Salvare gli oggetti correlati prima che l'oggetto attuale venga modificato su admin django

Ad esempio:

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) 

Ora, in Django Admin se salvare un oggetto padre, il risultato sarà sulla console.

Parent save 
Child save 

Ho bisogno che questo accada al fine Revese:

Child save 
Parent save 

risposta

9

Quanto segue salvare i bambini prima: risposta

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

seconda di ciò che esattamente vuole fare nei vostri segnali, si può solo cambiare il post_save per pre_save per il modello del bambino?

3

di ccrisan mi ha portato sulla strada giusta, ma penso che ci sia un difetto per quanto riguarda risparmio comportamento di istanze che non esistono ancora nel database. In questo caso non è possibile salvare prima gli oggetti correlati, perché non c'è nessuna chiave esterna a cui possano puntare. Per me la seguente estensione ha fatto il trucco:

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

stavo avendo problemi con le risposte in questo post, così ho capito una risposta più concisa. Stavo avendo un problema perché usando django-fsm, le altre risposte qui proverebbero a salvare il modello più volte (una volta per ogni formset) piuttosto che una volta alla fine.

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) 

Questo essenziale solo inverte l'ordine delle save_model e save_related come richiesto in Django ModelAdmin source

+0

non so se questo è una versione cosa Django, o una cosa logica di business, ma anche per Django 1.11 e il mio utilizzo. questa sembra essere la risposta corretta – ckot

Problemi correlati