2013-02-13 9 views
9

実際のオブジェクトをdjangoの管理フォームで編集する前に関連するオブジェクトを保存することはできますか?例えば実際のオブジェクトをdjango adminで編集する前に関連するオブジェクトを保存してください

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

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

admin.site.register(Parent,ParentsAdmin) 

admin.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" 

models.pyでは今、Djangoのadminに私はそれがコンソールに出力し、親オブジェクトを保存する場合。私はrevese順に行われるように必要

Parent save 
Child save 

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

あなたは正確にあなたの信号で実行する内容に応じて、あなただけの子モデルのためpre_saveするpost_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を使用しているので、ここでの他の答えは、最後に1回ではなく、モデルを複数回(すべてのformsetに対して)保存しようとするため、問題が発生していました。

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の順序を反転させ、これはDjangoのバージョンのもの、またはビジネス・ロジックのものであれば確かに、しかし、ジャンゴ1.11と私の使用のためではないDjango ModelAdmin source

+0

に呼び出されるようsave_related。これは正解と思われる – ckot

関連する問題