[Django]-Django admin inline – show only when changing object

6👍

As of Django 3.0, there is a ModelAdmin.get_inlines() method, which you can override like this:

def get_inlines(self, request, obj=None):
    if obj:
        return [FirstInline, SecondInline]
    else:
        return []

See Django Documentation.

1👍

ModelAdmin provides a method get_inline_instances for conditional inlines.

from the docs:

The get_inline_instances method is given the HttpRequest and the obj
being edited (or None on an add form) and is expected to return a list
or tuple of InlineModelAdmin objects.

for example:

class MyModelAdmin(admin.ModelAdmin):
    inlines = (MyInline,)

    def get_inline_instances(self, request, obj=None):
        return [inline(self.model, self.admin_site) for inline in self.inlines]

here you can check if obj is present or not.

One important point from the docs:

If you override this method, make sure that the returned inlines are
instances of the classes defined in inlines or you might encounter a
“Bad Request” error when adding related objects.

0👍

I use "get_inlines()" added to Django since v3.0 instead of "inlines = ()" as shown below so that "AddressInline" is not displayed when adding a user but it’s displayed when changing a user:

# "admin.py"

class AddressInline(admin.TabularInline):
    model = Address

@admin.register(CustomUser)
class CustomUserAdmin(UserAdmin):
    # inlines = (AddressInline,)
    
    # Here
    def get_inlines(self, request, obj=None):
        if obj:
            return (AddressInline,)
        else:
            return ()

    fieldsets = (
        # ...
    )
    add_fieldsets = (
        # ...
    )

Leave a comment