Djangopipe理员,隐藏模型
在注册模型出现的pipe理站点的根页面,我想隐藏注册到Djangopipe理员的几个模型。
如果我直接取消注册,那么随着添加新符号“+”消失,我无法添加新logging。
如何才能做到这一点 ?
根据x0nix的回答,我做了一些实验。 这似乎是从get_model_perms
返回一个空的字典从get_model_perms
排除模型,同时仍然允许您直接编辑实例。
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)
有同样的问题,在这里,我想出了。
像以前的解决scheme – 从Django复制index.html到你的/admin/index.html并修改它像这样:
{% for model in app.models %} {% if not model.perms.list_hide %} <tr> ... </tr> {% endif %} {% endfor %}
并创buildModelAdmin子类:
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子类注册的模型都不会显示在pipe理列表中,但可以通过“加号”详细显示:
class MyModelAdmin(HiddenModelAdmin): ... admin.site.register(MyModel, MyModelAdmin)
自从Django 1.8以来, ModelAdmin
已经有了一个名为has_module_permission()
的新方法,它负责在pipe理索引中显示一个模型。
class MyModelAdmin(admin.ModelAdmin): ... def has_module_permission(self, request): return False
丑陋的解决scheme: 覆盖pipe理索引模板,即将index.html从django复制到您的/admin/index.html,并添加如下内容:
{% for for model in app.models %} {% ifnotequal model.name "NameOfModelToHide" %} ...
这是顶部x0nix的答案,只有你很高兴隐藏与jQuery的行的替代build设。
从其他答案复制粘贴我重用的部分
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为上述工作。
Django 1.2拥有新的if语句,这意味着只有通过覆盖admin / index.html才能获得所需的function
{% if model.name not in "Name of hidden model; Name of other hidden model" %} ... {% endif %}
这是一个不好的解决scheme,因为它不关心多语言pipe理员。 您当然可以在所有支持的语言中添加模型的名称。 这是一个很好的解决scheme,因为它不会覆盖核心Django函数的多个方面。
但在改变任何事情之前,我认为人们应该思考这个…
本质上,这个问题涉及到有人不希望使用的模型,而不是仅仅偶尔添加一个下拉选项。 这可以通过为“不那么先进”的用户创build一组权限来有效地解决,当模型太多的时候,这些用户会惊慌失措。 如果需要更改特定型号,可以使用“高级帐户”login。
我有很多模型pipe理员注册和隐藏,如果你想要一个更干的解决scheme,这对我来说(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)
如果你想跨应用程序重用,我想你可以把它推到一个实用程序类中。
从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)