Django管理员,隐藏模型

时间:2010-03-12 09:45:01

标签: django django-admin

在注册模型出现的管理站点的根页面上,我想隐藏几个注册到Django管理员的模型。

如果我直接取消注册,我无法添加新记录,因为添加新符号“+”消失。

如何做到这一点?

9 个答案:

答案 0 :(得分:112)

根据x0nix's answer我做了一些实验。从get_model_perms返回一个空字典似乎从index.html中排除了模型,同时仍允许您直接编辑实例。

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)

答案 1 :(得分:22)

我遇到了同样的问题。

与之前的解决方案一样 - 将index.html从django复制到您的/admin/index.html并按照以下方式修改:

{% for model in app.models %}
    {% if not model.perms.list_hide %}
    <tr>
    ...
    </tr>
    {% endif %}
{% endfor %}

创建ModelAdmin子类:

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

现在,任何使用HiddenModelAdmin子类注册的模型都不会显示在管理员列表中,但会通过“加号”符号详细提供:

class MyModelAdmin(HiddenModelAdmin):
    ...

admin.site.register(MyModel, MyModelAdmin)

答案 2 :(得分:18)

自Django 1.8以来,ModelAdmin有一个名为has_module_permission()的新方法,负责在管理索引中显示模型。

要从管理员索引隐藏模型,只需在ModelAdmin课程中创建此方法,然后返回False。例如:

class MyModelAdmin(admin.ModelAdmin):
    ...
    def has_module_permission(self, request):
        return False

答案 3 :(得分:1)

丑陋的解决方案:override管理员索引模板,即将index.com从django复制到您的/admin/index.html并添加如下内容:

{% for for model in app.models %}
    {% ifnotequal model.name "NameOfModelToHide" %}
    ...

答案 4 :(得分:1)

这是x0nix答案的另一个选择,只有你很高兴用jquery隐藏行。

从另一个中复制粘贴回答我重复使用的部分

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)

然后安装django-jquery,然后在/admin/index.html模板中添加以下块:

{% 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 %}

您不需要复制粘贴整个模板,只需将其扩展并覆盖extrahead块即可。您需要django-apptemplates才能完成上述工作。

答案 5 :(得分:1)

例如,仅不要将 admin.site.register(MyModel, MyModelAdmin) 放在 admin.py 中。正常注册模型。

答案 6 :(得分:0)

Django 1.2有新的if语句,这意味着只有覆盖admin / index.html才能获得所需的功能

{% if model.name not in "Name of hidden model; Name of other hidden model" %}
    ...
{% endif %}

这是一个糟糕的解决方案,因为它不关心多语言管理员。您当然可以在所有支持的语言中添加模型的名称。这是一个很好的解决方案,因为它不会覆盖核心Django函数的多个方面。

但在改变任何事情之前,我认为人们应该考虑这个......

基本上,这个问题与拥有一个不希望使用的模型有关,而不仅仅是偶尔向下拉列表中添加一个选项。通过为“不太高级”的用户创建一组权限可以有效地解决这个问题,当有太多模型时,这些用户会感到恐慌。如果需要更改特定型号,可以使用“高级帐户”登录。

答案 7 :(得分:0)

我有很多模型管理员注册和隐藏,如果你想要一个更干的解决方案,这对我有用(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)

如果你想在应用程序中重复使用它,我想你可以把它推到实用程序类中。

答案 8 :(得分:0)

自Django 1.8.18 以来,has_module_permission()仍有问题。所以,在我们的例子中,我们也使用了get_model_perms()。同样,我们只需要为特定用户隐藏模型,但superuser应该能够访问其索引条目。

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)