7
votes

I am reading the save_model and save_formset in django admin from here

https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model

But I am confused as to when save_formset is called.

Shouldn't the formset be saved during save_model?

3

3 Answers

13
votes

The documentation could use a little clarification.

  • save_model is called during add or change to save the base model. It is specifically not intended to save related or inlined models.
  • save_related is called (once) after save_model completes to save off all related / inlined models.
  • save_formset is called potentially many times during each add / change, once for every inline defined on your ModelAdmin. It is called by the base class implementation of save_related.

If you look at the code for admin.ModelAdmin, you can see that save_model and save_related happen one after the other:

class ModelAdmin(BaseModelAdmin):
    def changeform_view(...):
        # ...
        if all_valid(formsets) and form_validated:
            self.save_model(request, new_object, form, not add)
            self.save_related(request, form, formsets, not add)

and that save_related has a simple implementation to call save_formset for each inline:

class ModelAdmin(BaseModelAdmin):
    # ...
    def save_related(self, request, form, formsets, change):
        form.save_m2m()
        for formset in formsets:
            self.save_formset(request, form, formset, change=change)
3
votes

save_model saves main model save_related saves ManyToMany and calls save_formset for each particular inline

1
votes

save_model is for the model being edited i.e. whatever model you registered your ModelAdmin with

save_formset is for saving the formsets (ModelAdmin.inlines)