2013-02-13 4 views
9

Возможно ли сохранить связанные объекты до фактического редактируемого объекта в форме администратора django?Сохранение связанных объектов до фактического редактируемого объекта на django admin

Например:

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

в admin.py

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

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

admin.site.register(Parent,ParentsAdmin) 

Теперь в Джанго администратора, если я сохранить родительский объект, он будет выводить на консоль.

Parent save 
Child save 

Мне нужно, чтобы это произошло в revese порядке:

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

В зависимости от того, что вы точно хотите сделать в ваших сигналов, вы можете просто изменить post_save к pre_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, другие ответы здесь попытаются сохранить модель несколько раз (один раз для каждого набора форм), а не один раз в конце.

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 и save_related, как называют в Django ModelAdmin source

+0

не уверен, если это Джанго версия вещь, или бизнес-логики вещь, но для Django 1.11 и моего использования. это, кажется, правильный ответ – ckot