Django admin, hide a model
As of Django 1.8.18, has_module_permission()
still has issue. So, in our case we used also the get_model_perms()
. Likewise, we need to hide the model for specific user only, but the superuser
should be able to access its index entry.
class MyModelAdmin(admin.ModelAdmin):
def get_model_perms(self, request):
if not request.user.is_superuser:
return {}
return super(MyModelAdmin, self).get_model_perms(request)
admin.site.register(MyModel, MyModelAdmin)
For Django 1.8 and above
Since Django 1.8, ModelAdmin
has got a new method called has_module_permission()
which is responsible for displaying a model in admin index.
To hide a model from admin index, just create this method in your ModelAdmin
class and return False
. Example:
class MyModelAdmin(admin.ModelAdmin):
...
def has_module_permission(self, request):
return False
Got the same problem, here what I came up with.
Like in previous solution - copy index.html from django to your /admin/index.html and modify it like this:
{% for model in app.models %}
{% if not model.perms.list_hide %}
<tr>
...
</tr>
{% endif %}
{% endfor %}
And create ModelAdmin subclass:
class HiddenModelAdmin(admin.ModelAdmin):
def get_model_perms(self, *args, **kwargs):
perms = admin.ModelAdmin.get_model_perms(self, *args, **kwargs)
perms['list_hide'] = True
return perms
Now any model registered with HiddenModelAdmin subclass won't show up in admin list, but will be available via "plus" symbol in detail:
class MyModelAdmin(HiddenModelAdmin):
...
admin.site.register(MyModel, MyModelAdmin)
Based on x0nix's answer I did some experiments. It seems like returning an empty dict from get_model_perms
excludes the model from index.html, whilst still allowing you to edit instances directly.
class MyModelAdmin(admin.ModelAdmin):
def get_model_perms(self, request):
"""
Return empty perms dict thus hiding the model from admin index.
"""
return {}
admin.site.register(MyModel, MyModelAdmin)