Django admin, скрыть модель


на корневой странице сайта администратора, где отображаются зарегистрированные модели, я хочу скрыть несколько моделей, зарегистрированных в Администраторе Django.

Если я непосредственно отменить регистрацию тех, Я не могу добавить новые записи, Как добавить новый символ "+" исчезает.

Как это можно сделать ?

8 67

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)