Hide inline form in Django

My Django ModelAdmin shows different forms depending on user rights. I solved this with ModelForm (get_form, get_fieldsets), but what to do with inline lines?

class NewsAdmin(admin.ModelAdmin):
    form = NewsAdminForm
    writing_form = NewsWritingForm

    inlines = (LinkInline, FileInline)

ModelAdmin initializes them in ModelAdmin.__init__()before receiving the request object. The only way, apparently, is to use CSS to hide them.

+3
source share
4 answers

You can use the ModelAdmin function get_inline_instances. The following code removes rows from add_view:

from django.contrib import admin
from models import FooModel

class FooInline(admin.StackedInline):
    model = FooModel

class MyModelAdmin(admin.ModelAdmin):
    inlines = [FooInline]

    def get_inline_instances(self, request, obj=None):
        return obj and super(MyModelAdmin, self).get_inline_instances(request, obj) or []
+4
source

ModelAdmin.__init__()takes classes in ModelAdmin.inlines, creates them, and stores the results in ModelAdmin.inline_instances. You can set ModelAdmin.inline_instancesto an empty list after __init__to delete lines.

. 243 django/contrib/admin/options.py

+1

I solved this by putting the logic to install self.inline_instances = []in the method get_readonly_fields(self, request, obj=None).

For example, if you want to show inline strings for superusers, but not for anyone else:

def get_readonly_fields(self, request, obj=None):
    if request.user.is_superuser:
        return ()
    else:
        self.inline_instances = []
        return ()
+1
source

I used the bskinner trick to hide inline lines when adding a new object with two settings: firstly, I had to rewrite "inlines" and not "inline_instances", and secondly, make sure you always return self.readonly_fields so that make sure you keep them when they are installed.

def get_readonly_fields(self, request, obj=None):
    if obj: 
        # edit mode... add fields here to make them read-only when editing
        return self.readonly_fields
    else:
        self.inlines = []
        return self.readonly_fields
0
source

All Articles