Dashboard
Индекс Admin — это dashboard. Вы объявляете компоненты и раскладываете
их по блокам на сетке из четырёх колонок. DashboardService проверяет
раскладку и рендерит SSR-контекст. Live-виджеты обновляются через
dashboard/live/.
Шаблон индекса: admin/chassis/dashboard/index.html (наследует
admin/index.html). Меняйте index_template только если заменяете всю
страницу.
Анатомия страницы
┌─ navbar (тема, кнопки, dropdown групп страниц, меню пользователя) ─┐
├─ sidebar (объявленные sidebar_items) ───────────────────────────────┤
├─ полоса алертов (override `nav-breadcrumbs`) ───────────────────────┤
│ глобальные / alert-блоки (`is_global=True`, только ALERTS) │
├─ основная сетка (`admins-dashboard-layout`) ────────────────────────┤
│ ряд 1: блок size 2 + блок size 2 │
│ ряд 2: блок size 4 (на всю ширину) │
│ … │
│ опционально aside: «Recent actions» Django (`show_recent_actions`) │
└─────────────────────────────────────────────────────────────────────┘
Каждый блок подключает templates/admin/chassis/dashboard/sections/*.html
по DashboardBlockType. Графики — ApexCharts. Live-виджеты опрашивают
{% url 'admin:dashboard_live' %} с If-None-Match.
Если dashboard_component_classes пуст, оболочка всё равно рисуется:
бренд, sidebar, navbar и пустая сетка.
Компоненты и блоки
from django.utils.translation import gettext_lazy as _
from django_chassis.dto import DashboardBlockDTO
from django_chassis.enums import DashboardBlockType
class CustomAdminSite(ChassisAdminSiteMixin, AdminSite):
dashboard_component_classes = (OpenOrdersMetric, RevenueChart, NightlyImportAlert, RebuildSearchAction)
dashboard_blocks = (
DashboardBlockDTO(
slug='alerts',
title=_('Alerts'),
block_type=DashboardBlockType.ALERTS,
component_slugs=('nightly-import',),
row=1,
size=4,
is_global=True,
),
DashboardBlockDTO(
slug='kpis',
title=_('Overview'),
block_type=DashboardBlockType.METRICS,
component_slugs=('open-orders',),
row=2,
size=2,
),
DashboardBlockDTO(
slug='revenue',
title=_('Revenue'),
block_type=DashboardBlockType.CHART,
component_slugs=('revenue',),
row=2,
size=2,
),
)
DashboardBlockDTO
| Параметр | Тип | По умолчанию |
|---|---|---|
slug | уникальный id блока | обязательный |
title | локализованная строка | обязательный |
block_type | DashboardBlockType | обязательный |
component_slugs | slug компонентов в этом блоке | обязательный |
row | строка сетки | 1 |
group | группа раскладки | 'default' |
size | 1–4 колонки | 4 |
order | сортировка внутри строки | 100 |
is_global | растянуть на всю ширину | False |
DashboardBlockType: alerts, metrics, actions, metrics_and_actions,
chart.
Правила раскладки
- Сетка — четыре колонки.
- Блок графика содержит ровно один график.
- Один slug компонента нельзя назначить дважды.
is_global=Trueможно ставить только у блоков alerts.- Неизвестные slug и пустые
component_slugsне проходят валидацию.
Live-эндпоинт
GET {admin}/dashboard/live/ возвращает текущий снимок виджетов. Шлите
If-None-Match, чтобы получить 304, если ETag не изменился.
DashboardLiveSerializationService строит детерминированные ETag.
У виджетов есть etag, fetched_at и next_refresh_at, если компонент
их отдаёт.
Видимость
Каждый компонент наследует:
slug,label,order,statuscheck_view(request)/check_use(request)is_visible/is_available— суперпользователи видят и используют всё;HIDDENскрывает виджет; статус не-ACTIVEблокирует использование
Конкретные контракты компонентов — в Метрики и графики dashboard.