what is the diff between save_model and save_formset in django admin

django, django-admin, python

Solution

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)

Problem

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`?

Original source