Django admin, скрыть модель
на корневой странице сайта администратора, где отображаются зарегистрированные модели, я хочу скрыть несколько моделей, зарегистрированных в Администраторе Django.
Если я непосредственно отменить регистрацию тех, Я не могу добавить новые записи, Как добавить новый символ "+" исчезает.
Как это можно сделать ?
8 ответов:
на основе ответ x0nix Я провел несколько экспериментов. Это похоже на возвращение пустой дикт от
get_model_perms
исключает модель из индекса.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)
получил ту же проблему, вот что я придумал.
как и в предыдущем решении - индекс копию.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)
Начиная С Django 1.8,
ModelAdmin
получил новый метод под названиемhas_module_permission()
, который отвечает за отображение модели в индексе админ.чтобы скрыть модель из индекса администратора, просто создайте этот метод в своем
ModelAdmin
класс и возвратFalse
. Пример:class MyModelAdmin(admin.ModelAdmin): ... def has_module_permission(self, request): return False
уродливые решение: переопределить admin index template т. е. копировать индекс.html от django до вашего/admin / index.HTML и добавить что-то вроде этого:
{% for for model in app.models %} {% ifnotequal model.name "NameOfModelToHide" %} ...
это альтернативное здание поверх ответа 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 для того, чтобы работать.
Django 1.2 имеет новые операторы if, что означает, что желаемая функция может быть получена только путем перезаписи admin/index.HTML-код
{% if model.name not in "Name of hidden model; Name of other hidden model" %} ... {% endif %}
это плохое решение, потому что оно не заботится о многоязычных администраторах. Вы можете, конечно, добавить имена моделей на всех поддерживаемых языках. Это хорошее решение, потому что оно не перезаписывает более одного аспекта основных функций Django.
но прежде чем что-то менять, я думаю, люди должны подумать этот...
по существу проблема связана с наличием моделей, которые не хотят использовать больше, чем добавление опции в раскрывающийся список время от времени. Его можно эффективно обойти, создав набор разрешений для "не очень продвинутых" пользователей, которые паникуют, когда слишком много моделей. В случае необходимости изменения конкретной модели, можно просто войти в "расширенный аккаунт".
У меня было много администраторов модели, чтобы зарегистрироваться и скрыть, если вы хотите более сухое решение, это сработало для меня (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)
Я думаю, вы можете свернуть его в служебный класс, если хотите повторно использовать его в приложениях.
как Джанго 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)