Изменение порядка объектов модели в панели администратора django

У меня есть несколько объектов конфигурации в панели администратора django. Они перечислены в следующем порядке

  • Настройка электронной почты
  • Общая конфигурация
  • Сетевая конфигурация

Каждый объект может быть настроен отдельно, но все они включены в General config. Так что в основном вам понадобится в основном General config, поэтому я хочу переместить ее на верх. Я знаю, как упорядочить поля в самой модели, но как изменить порядок моделей?

Ответы

Ответ 1

Я не вижу в этом очевидного решения - модели сортируются по их _meta.verbose_name_plural, и это происходит внутри представления AdminSite.index, без видимого места для перехвата пользовательского кода, без подкласса класса AdminSite и предоставления собственных индексный метод, который, однако, является огромным монолитным методом, очень наследуемым - недружественным.

Ответ 2

Поэтому я только что написал пакет django, который позволит вам переупорядочить ярлык приложения и список имен django app/rename (включая сторонние приложения) - вы можете скачать его здесь:

https://github.com/mishbahr/django-modeladmin-reorder

Ответ 3

Если вы не против использовать грязный трюк, добавьте verbose_name_plural ваших моделей с определенным количеством невидимых пробелов нулевой ширины. Например, добавьте "Конфигурация электронной почты" с 1 пробелом нулевой ширины, "Общая конфигурация" с 2 и "Конфигурация сети" с 3. Это действительно самый простой метод, и я еще не нашел недостатков.

Ответ 4

Я нашел этот фрагмент для переупорядочения моделей в панели администратора django - он работает для нас (хотя ознакомьтесь с комментариями ниже фрагмента для обновлений, чтобы он работал с Django> = 1.4)

И в долгосрочной перспективе есть отчет об ошибке django об упорядочении моделей в приложениях. Отчет об ошибке открыт на момент написания ответа.

Ответ 5

Если вы просто хотите изменить порядок своих приложений (тестирование с помощью Django 1.11.10).

class MyAdminSite(AdminSite):
    def index(self, request, extra_context=None):
        if extra_context is None:
            extra_context = {}

        # Move last app to the top of 'app_list'.
        app_list = self.get_app_list(request)
        app_list.insert(0, app_list.pop(-1))

        extra_context['app_list'] = app_list
        return super().index(request, extra_context)