Django admin, hide a model

后端 未结 8 970
广开言路
广开言路 2020-11-30 23:42

At the root page of the admin site where registered models appear, I want to hide several models that are registered to the Django admin.

If I directly unregister th

相关标签:
8条回答
  • 2020-12-01 00:13

    I had lots of model admins to register and hide, if you want a more DRY solution, this worked for me (Django 1.10, Python 3.5)

    # admin.py
    
    def register_hidden_models(*model_names):
        for m in model_names:
            ma = type(
                str(m)+'Admin',
                (admin.ModelAdmin,),
                {
                    'get_model_perms': lambda self, request: {}
                })
            admin.site.register(m, ma)
    
    register_hidden_models(MyModel1, MyModel2, MyModel3)
    

    I guess you could roll it into a utility class if you want to re-use it across apps.

    0 讨论(0)
  • 2020-12-01 00:14

    This is an alternative building on top x0nix's answer, and only if you are happy hiding the the rows with jquery.

    Copy pasting from the other answer the part that I reused

    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
    
    class MyModelAdmin(HiddenModelAdmin):
    ...
    
    admin.site.register(MyModel, MyModelAdmin)
    

    Then install django-jquery and then add the following block in your /admin/index.html template:

    {% extends "admin:admin/index.html" %}
    
    {% block extrahead %}
        <script type="text/javascript" src="{{ STATIC_URL }}js/jquery.js"></script>
        {% if app_list %}
          <script type="text/javascript">
            $(function(){
              {% for app in app_list %}
                {% for model in app.models %}
                    {% if model.perms.list_hide %}
                        $('div.app-{{ app.app_label }}').find('tr.model-{{ model.object_name|lower }}').hide();
                    {% endif %}
                {% endfor %}
              {% endfor %}
            });
         </script>
       {% endif %}
    {% endblock %}
    

    You don't need to copy paste the whole template, just extend it and override the extrahead block. You'll need django-apptemplates for the above to work.

    0 讨论(0)
  • 2020-12-01 00:17

    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)
    
    0 讨论(0)
  • 2020-12-01 00:18

    Ugly solution: override admin index template i.e. copy index.html from django to your /admin/index.html and add something like this:

    {% for for model in app.models %}
        {% ifnotequal model.name "NameOfModelToHide" %}
        ...
    
    0 讨论(0)
  • 2020-12-01 00:26

    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)
    
    0 讨论(0)
  • 2020-12-01 00:27

    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
    
    0 讨论(0)
提交回复
热议问题