在注册模型出现的管理站点的根页面上,我想隐藏几个注册到Django管理员的模型。
如果我直接取消注册,我无法添加新记录,因为添加新符号“+”消失。
如何做到这一点?
答案 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)