2013-02-13 1 views
9

장고 관리 양식에서 실제 객체를 편집하기 전에 관련 객체를 저장할 수 있습니까? 예를 들어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에서 이제 장고 관리자에 나는 콘솔에 출력되며, 부모 개체를 저장합니다.

Parent save 
Child save 

나는이 revese 위해 일해야합니다

Child save 
Parent save 

답변

9

다음은 먼저 아이들을 절약 할 수 있습니다. 이 경우 관련 객체를 먼저 저장할 수 없습니다. 왜냐하면 이들 객체가 가리킬 수있는 외래 키가 없기 때문입니다. 나를 위해 다음과 같은 확장 트릭을 않았다 :

0

방금 ​​아동 모델 pre_save하는 post_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의 대답은 바른 길에 나를 데리고,하지만 난 아직 데이터베이스에 존재하지 않는 경우의 행동에 저장에 대한 결함이 있다고 생각 :

5

나는이 게시물의 답변에 문제가있어서, 나는 더 간결한 대답을 알아 냈다. django-fsm을 사용하기 때문에 문제가 발생했습니다. 여기에있는 다른 답변은 모델을 여러 번 저장하려고합니다 (모든 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 ModelAdmin source

+0

이 장고 버전 것, 또는 비즈니스 로직 일이 있는지 확실하지 않습니다 호출로 save_related하지만, 장고 1.11 내 사용을 위해. 이것은 정답 인 것 같다. – ckot

관련 문제