Как это работает
Chassis — тонкий слой сборки над Django Admin. Вы объявляете возможности. Сервисы превращают их в URL, контекст шаблонов и проверки прав. Шаблоны и статика рисуют результат.
Два миксина
Публичные точки входа — ChassisAdminSiteMixin и ChassisAdminMixin.
ChassisAdminSiteMixin + AdminSite
├── dashboard_component_classes / dashboard_blocks → DashboardService
├── navbar_button_classes / user_menu_item_classes → AdminNavbarService
├── chassis_page_classes → AdminPageService
├── sidebar_items → AdminSidebarService
└── оборачивает сторонние ModelAdmin в ChassisAdminMixin
ChassisAdminMixin + ModelAdmin
└── options: list[AdminOption]
├── SearchOption, FiltersOption, DateHierarchyOption, tabs
├── RowActionsOption, ListActionsOption, ObjectActionsOption
├── RelatedEntitiesOption
└── ImportOption, ExportOption
Оба миксина должны стоять перед классом Django в MRO, чтобы хуки могли
обернуть super().
Внутренняя композиция ModelAdmin
django_chassis.mixins.admin остаётся публичным модулем
ChassisAdminMixin. Его реализация собирается из специализированных классов в
django_chassis.mixins.core:
AdminCoreMixin— общие options и типизированный доступ к следующемуModelAdminAdminPermissionsMixinиAdminAuditMixin— доступ и аудит CRUD-действийAdminChangeListMixinиAdminObjectPageMixin— список и страница объектаAdminActionsMixinиAdminImportExportMixin— действия и потоки данныхAdminPresentationMixin— динамические поля, колонки и виджеты
Эти классы являются деталями реализации. Приложения продолжают наследовать
только ChassisAdminMixin; его публичные пути импорта и позиция в MRO
приложения не меняются.
Менеджеры моделей
Django-классы Manager и QuerySet находятся в
django_chassis.models.managers. Модули моделей содержат объявления моделей и
подключают импортированный менеджер, но не объявляют инфраструктуру запросов
внутри модели.
Frozen options
ModelAdmin не наследует десяток миксинов ради поиска, badges и export. Он
добавляет frozen dataclass в options. ChassisAdminMixin находит каждый тип,
прокидывает его в атрибуты Django Admin (search_fields, list_filter, …)
и отдаёт остальное шаблонам.
Отсутствующие типы берутся из значения по умолчанию миксина. Сейчас это
RowActionsOption() — кнопка просмотра на каждом changelist.
Settings — не AdminOption. Это отдельный dataclass на
chassis_settings для свёрнутых fieldset и стандартной кнопки add.
Сервисы
Работа уровня сайта не живёт во views. Сайт создаёт сервисы:
| Сервис | Ответственность |
|---|---|
DashboardService | Реестр компонентов, проверка раскладки, SSR-контекст, live JSON |
AdminNavbarService | Тема, свои кнопки, группы страниц, user menu |
AdminPageService | Маршруты страниц и группы navbar/dashboard |
AdminSidebarService | Ссылки на модели/страницы, права, активное состояние |
Класс сервиса можно заменить на сайте (dashboard_service_class, …) или
переопределить get_*_service().
Путь запроса
- Django направляет запрос на Chassis
AdminSite. each_contextкладёт бренд, sidebar, navbar и footer в каждый шаблон Admin.- Индекс (
/):DashboardServiceраскладываетdashboard_blocksпо slug компонентов и рендеритadmin/chassis/dashboard/index.html. Live-виджеты опрашиваютdashboard/live/сIf-None-Match. - Changelist:
ChassisAdminMixin.changelist_viewчитает options, собирает вкладки / поиск / фильтры / list actions и рендеритadmin/chassis/change_list.html. - Change form:
changeform_viewдобавляет кнопки объектных действий и таблицы связанных сущностей (admin/chassis/change_form.html). - Своя страница:
AdminPage.dispatchпроверяет контракт доступа, затемview()/render(). - Объектное действие / import / export: дополнительные URL из
ChassisAdminMixin.get_urls().
Отсутствующий тип option — не ошибка. Mixin берёт class-level значение
(RowActionsOption()) или не рисует этот chrome (нет fieldset поиска без
SearchOption).
Шаблоны
'django_chassis' должен стоять перед 'django.contrib.admin' в
INSTALLED_APPS. Chassis поставляет полный overlay шаблонов Admin и
параллельное семейство admin/tabler/. Доменным приложениям не нужно
копировать эти шаблоны.
См. Тема.
Чего Chassis не делает
- Не владеет вашими моделями.
- Не заменяет права Django; он их проверяет.
- Не придумывает новую схему URL admin. Свои страницы и действия dashboard —
дополнительные маршруты на том же
AdminSite.