Недавно я опубликовал на Хабре статью о небольшом пакете django-scroll-to-top, который добавляет кнопку «Наверх» в проекты на Django. Сам пакет решает довольно локальную задачу, но обсуждение под статьёй оказалось интереснее, чем я ожидал.
В комментариях возник вполне закономерный вопрос: насколько вообще подобным интерфейсным дополнениям место в стандартной Django Admin? Ведь каждое установленное приложение добавляет свои пункты в боковое меню, и со временем административная панель действительно может начать выглядеть перегруженной.
Один из комментариев заставил меня посмотреть на эту проблему немного под другим углом. В результате вместо долгого спора появился ещё один небольшой open-source-пакет — теперь уже для сворачивания групп приложений в боковой панели Django Admin.
С чего всё началось
Под предыдущей статьёй появился такой комментарий:
Моё мнение такое — эта штука не для админки. Она загромождает своим функционалом, её настройки хочется видеть в settings. Админка — это про бизнес-логику, а не frontend.
Оригинал комментария и обсуждение на Хабре
С первой частью замечания сложно спорить. В крупных проектах административная панель постепенно обрастает десятками приложений: собственные модели, сторонние библиотеки, служебные инструменты, настройки внутренних модулей. Левое меню становится всё длиннее, а нужные пункты приходится искать среди тех, которыми пользуешься раз в месяц.
При этом переносить все настройки django-scroll-to-top в settings.py мне по-прежнему не хотелось.
Положение кнопки, её размеры, внешний вид, отступы и поведение — это изменяемые параметры интерфейса. Чтобы поправить цвет или сместить кнопку на несколько пикселей, не обязательно открывать конфигурационный файл проекта, менять код и заново разворачивать приложение.
Получалось, что проблема не столько в наличии настроек в административной панели, сколько в том, что любой новый раздел постоянно занимает место в боковом меню.
Отсюда появилась довольно простая мысль: если группа используется редко, почему бы не дать пользователю возможность её свернуть?
Сначала — внутри одного пакета
Первую реализацию я сделал непосредственно для django-scroll-to-top.
Переключатель сворачивает только группу самого приложения. Остальные разделы Django Admin, стандартные приложения и нижние элементы боковой панели не затрагиваются.
Состояние хранится в cookie браузера. Когда пользователь сворачивает группу, cookie создаётся на длительный срок. Когда снова разворачивает — cookie удаляется.
Для этого не нужны база данных, миграции, дополнительные модели или отдельная административная страница. Каждый пользователь настраивает меню под себя в конкретном браузере, не влияя на остальных сотрудников.
Для самого django-scroll-to-top этого было достаточно. Но после реализации возник следующий вопрос: почему такой механизм должен работать только для одного конкретного приложения?
Оказалось, что идея совсем не новая
Перед тем как выносить функциональность в отдельный пакет, я решил посмотреть, какие похожие решения уже существовали в экосистеме Django.
Самым близким по назначению оказался проект django-foldable-admin. Он позволял сворачивать группы приложений в Django Admin ещё много лет назад. Однако проект больше не поддерживается. В репозитории упоминаются Django 1.8, Python 2.7 и ранние версии Python 3, а установка предполагала ручное копирование шаблонов, CSS и JavaScript, а также подключение jQuery.
Несмотря на возраст реализации, сама идея осталась актуальной. Она показывает, что проблема перегруженного бокового меню существовала задолго до появления современной навигационной панели Django Admin.
Более крупный подход предлагает django-admin-tools. Это уже целый набор инструментов для перестройки административного интерфейса: настраиваемый dashboard, собственное меню, перемещаемые и сворачиваемые блоки.
Возможностей у проекта значительно больше, но и масштаб решения совсем другой. Если требуется только небольшой переключатель рядом с названием приложения, подключать полноценную систему ради одной функции может быть избыточно.
Похожие возможности встречаются и в современных темах административной панели. Например, django-admin-interface поддерживает сворачиваемые приложения в навигации, а django-unfold позволяет организовывать боковое меню со сворачиваемыми секциями.
Но такие проекты заметно глубже меняют внешний вид и устройство Django Admin. Это хорошие варианты для тех, кому нужна полноценная современная тема, однако мне хотелось сохранить стандартную административную панель и добавить к ней только одну небольшую возможность.
Получилась довольно знакомая ситуация: идея существует давно, ближайший по назначению маленький пакет больше не поддерживается, а актуальные альтернативы предлагают значительно более крупную переработку интерфейса.
Преемственность без копирования старого решения
Мне не хотелось представлять возможность сворачивания приложений как нечто принципиально новое.
Напротив, django-foldable-admin можно считать прямым идейным предшественником нового пакета. Он решал похожую задачу для Django своего времени и подтвердил, что такая функция действительно была нужна разработчикам.
От старых решений сохраняется сама концепция: редко используемое приложение можно убрать из поля зрения, не отключая его, не меняя разрешения и не удаляя из проекта.
Реализация при этом сделана заново с учётом современной структуры стандартной Django Admin. Пользователю не требуется вручную копировать шаблоны, подключать jQuery или заменять весь административный интерфейс ради одного переключателя.
Поэтому появился отдельный пакет
Сначала механизм сворачивания был частью django-scroll-to-top, но оставлять его привязанным к одному приложению было бы странно.
Кнопка «Наверх» никак не связана со сворачиванием разделов административной панели. Кроме того, возможность убирать редко используемые группы может пригодиться разработчикам, которым сама кнопка вообще не нужна.
Поэтому функциональность была вынесена в самостоятельный пакет — django-admin-collapse-apps.
Он решает одну конкретную задачу: добавляет переключатели для сворачивания групп приложений в левой боковой панели стандартной Django Admin.
Если список приложений не задан, переключатели появляются у всех доступных групп. Если список указан, сворачиваемыми становятся только перечисленные приложения.
Состояние каждой группы сохраняется отдельно в cookie конкретного браузера. Пакет не требует собственных моделей, миграций или дополнительного интерфейса настройки.
Мне хотелось, чтобы он оставался маленьким и предсказуемым: установил, указал нужные приложения — и всё работает.
Почему cookie, а не база данных
Технически состояние меню можно было бы хранить в профиле пользователя. Тогда оно синхронизировалось бы между браузерами и устройствами.
Но для небольшого интерфейсного улучшения такой подход выглядел избыточным.
Потребовалась бы отдельная модель или дополнительное поле, миграции, запросы к базе данных и логика интеграции с пользовательской моделью проекта. Причём ради хранения информации о том, свернул человек один раздел меню или нет.
Cookie решает задачу значительно проще. Пользователь свернул группу — состояние сохранилось. Развернул — сохранённое значение удалилось.
На другом компьютере административная панель откроется в стандартном виде. В текущем браузере пользователь один раз настроит меню под себя, после чего оно останется таким до следующего изменения.
Для подобной функции этого вполне достаточно.
Админка всё-таки немного frontend
Фраза о том, что административная панель относится к бизнес-логике, а не к frontend, мне понятна.
Через Django Admin действительно управляют объектами предметной области: пользователями, заказами, публикациями, документами, справочниками и другими важными данными.
Но сотрудники взаимодействуют с этой бизнес-логикой через интерфейс. Если в нём десятки приложений и сотни ссылок, качество навигации перестаёт быть исключительно декоративным вопросом.
Возможность свернуть редко используемый раздел не меняет бизнес-логику проекта. Она лишь помогает быстрее добраться до нужной части административной панели.
Поэтому комментарий оказался полезным. Настройки кнопки я не перенёс в settings.py, зато сначала сделал группу приложения сворачиваемой, а затем превратил общий механизм в отдельный пакет.
Установка
Пакет опубликован на PyPI и устанавливается обычной командой:
pip install django-admin-collapse-apps
После установки его нужно добавить в INSTALLED_APPS перед django.contrib.admin:
INSTALLED_APPS = [ "django_admin_collapse_apps", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", # Приложения проекта]
После этого необходимо выполнить стандартную сборку статических файлов, если она используется в проекте:
python manage.py collectstatic
По умолчанию возможность сворачивания добавляется ко всем группам приложений в боковой панели.
Если переключатели нужны только для отдельных приложений, их можно перечислить в settings.py:
ADMIN_COLLAPSE_APPS = [ "auth", "scroll_to_top",]
Значения соответствуют меткам приложений Django.
После настройки рядом с заголовками выбранных групп появится переключатель. Состояние каждой группы будет сохраняться в браузере пользователя.
Ссылки на репозиторий, полную документацию и доступные параметры настройки можно найти на странице проекта.
Что дальше
После публикации django-scroll-to-top я неожиданно заметил, что вокруг стандартной Django Admin накопилось много небольших идей, которые могут сделать повседневную работу удобнее.
Это не обязательно новые темы оформления, замена всей административной панели или очередной frontend-фреймворк. Иногда речь идёт о функции, которая занимает несколько десятков строк кода, решает одну понятную задачу и почти не требует настройки.
Мне нравится идея выпускать такие улучшения отдельными пакетами. Каждый из них делает только что-то одно: нужен — устанавливаешь, не нужен — просто проходишь мимо. Небольшие независимые модули проще понимать, тестировать и поддерживать, чем один универсальный комбайн.
Поэтому, если вам не хватает какой-то небольшой, но полезной возможности в стандартной Django Admin, расскажите об этом в комментариях.
Не обещаю реализовать абсолютно всё. Но если идея покажется полезной, будет интересна не только одному конкретному проекту и не потребует превращать небольшой модуль в огромную систему, я с удовольствием попробую сделать ещё один open-source-пакет.
В конце концов, django-admin-collapse-apps тоже появился благодаря всего одному хорошему комментарию.
ссылка на оригинал статьи https://habr.com/ru/articles/1057784/