Свои страницы
Кастомные страницы живут на AdminSite. Они используют оболочку Chassis
(sidebar, navbar, бренд, breadcrumbs), но это не ModelAdmin. Каждый класс
обязан объявить ровно один контракт доступа.
| Класс | Доступ | Группы |
|---|---|---|
PermissionAdminPage | PermissionOption с codename view_* | можно в navbar / dashboard |
PersonalAdminPage | аутентифицированный staff | нельзя в группы |
SuperuserAdminPage | активный superuser | можно в группы |
Все они наследуют AdminPage. При создании сайта —
ImproperlyConfigured, если класс смешивает два контракта, не объявляет
ни одного или кладёт personal-страницу в группу.
from django.http import HttpRequest, HttpResponse
from django.utils.translation import gettext_lazy as _
from django_chassis.options import AdminPageGroupOption, PermissionOption
from django_chassis.views import PermissionAdminPage
reports_group = AdminPageGroupOption(slug='reports', label=_('Отчёты'), icon_class='fa-solid fa-chart-line', order=10)
view_inventory = PermissionOption(
app_label='catalog', model='book', codename='view_inventory', name=_('Может смотреть склад')
)
class InventoryPage(PermissionAdminPage):
slug = 'inventory'
title = _('Склад')
label = _('Склад')
description = _('Обзор остатков')
icon_class = 'fa-solid fa-boxes-stacked'
permission = view_inventory
navbar_group = reports_group
dashboard_group = reports_group
def view(self, request: HttpRequest) -> HttpResponse:
return self.render(request, rows=[])
Класс регистрируется на сайте:
class CustomAdminSite(ChassisAdminSiteMixin, AdminSite):
chassis_page_classes = (InventoryPage,)
AdminPageService монтирует маршруты. Чтобы PermissionAdminPage была в
sidebar, добавьте SidebarPageItemOption(page_slug='inventory') в
sidebar_items. Personal и superuser страницы нельзя класть в sidebar
как дочерние пункты.
Анатомия страницы
Шаблон по умолчанию: admin/chassis/page.html.
┌─ breadcrumbs ─────────────────────────────────────────────┐
│ Dashboard › раздел sidebar › label страницы │
├─ тулбар (`page_actions`) ─────────────────────────────────┤
│ опциональные кнопки (информационные страницы) │
├─ title / description ─────────────────────────────────────┤
├─ `chassis_page_content` ──────────────────────────────────┤
│ то, что `view()` / `render()` положили в контекст │
└───────────────────────────────────────────────────────────┘
dispatch() проверяет has_view_permission. Отказ — PermissionDenied
(страница ошибки Chassis, если подключён AdminErrorPageMiddleware).
Успех вызывает view().
render(request, **context) смешивает:
admin_site.each_context(request)(бренд, sidebar, navbar, footer)chassis_page— экземпляр страницыtitle/sidebar_section_labelизAdminSidebarService- любые дополнительные kwargs
Атрибуты AdminPage
| Атрибут | Тип | По умолчанию | Назначение |
|---|---|---|---|
slug | str | обязательно | сегмент URL и ссылка sidebar |
title | локализованная строка | обязательно | заголовок |
label | локализованная строка | обязательно | подпись в навигации |
description | локализованная строка | '' | необязательный лид |
icon_class | класс Font Awesome | 'fa-solid fa-table-list' | sidebar / группы |
order | int | 0 | порядок среди страниц |
template_name | str | 'admin/chassis/page.html' | можно переопределить |
filters_fieldset_title | локализованная строка | _('Фильтры') | если страница рисует фильтры |
chassis_settings | Settings | Settings() | те же флаги свёртки, что у ModelAdmin |
navbar_group | AdminPageGroupOption или None | None | dropdown navbar |
dashboard_group | AdminPageGroupOption или None | None | секция действий dashboard |
route_prefix | str | 'pages' | первый сегмент URL |
URL: {admin}/{route_prefix}/{slug}/. Имя URL: chassis_page_{slug}
(в namespace AdminSite).
Реализуйте view(self, request) (не get() / post() на базе —
dispatch всегда вызывает view). Ветку POST делайте внутри view по
request.method.
Контракты доступа
PermissionAdminPage
permission должен быть PermissionOption с codename, который
начинается с view_. Сайт регистрирует его сам. Проверка идёт через
AdminPermissionService / has_request_user_permission (по умолчанию
group-only).
PersonalAdminPage
Любой аутентифицированный staff. Нельзя задавать navbar_group и
dashboard_group. Для «мой профиль», «мои токены» и похожих экранов.
SuperuserAdminPage
request.user.is_active и is_superuser.
Страницы объекта
AdminObjectPage[T] расширяет кастомную страницу списком,
карточкой объекта и методами @object_action. Объект не обязан
быть моделью Django: вы сами его резолвите.
Дополнительные маршруты:
| Маршрут | Имя |
|---|---|
{prefix}/{slug}/ | chassis_page_{slug} — список (view) |
{prefix}/{slug}/{object_id}/ | chassis_page_{slug}_object |
{prefix}/{slug}/{object_id}/actions/{action_name}/ | chassis_page_{slug}_object_action |
Нужно реализовать:
| Метод | Роль |
|---|---|
view(request) | страница списка |
get_object(request, object_id) -> T | None | None → HTTP 404 |
get_object_context_data(request, object_id, obj) | доп. контекст карточки |
object_actions | список имён методов @object_action |
Шаблон карточки: admin/chassis/object_page.html
(object_template_name). В тулбаре — разрешённые объектные действия.
Permission и condition / condition_method проверяются повторно на URL
действия.
Если объект исчез, действие редиректит на список с ошибкой. Неизвестное или запрещённое действие возвращает на карточку.
Информационные страницы
AdminInformationPage — структурированный отчёт (секции, алерты,
действия шапки, timeline). См.
Информационные страницы.