Язык и оформление
Настройки задаются при создании каждого экземпляра админки. API одинаков для FastAPI и Litestar:
from quite_admin import Admin, Theme
admin = Admin(
auth=auth_backend,
secret_key=session_secret,
title="Управление магазином",
description="Товары, клиенты и заказы в одном месте.",
language="ru",
logo="assets/logo.svg",
theme=Theme(
primary="#2563eb",
background="#f8fafc",
surface="#ffffff",
text="#0f172a",
muted="#64748b",
border="#e2e8f0",
danger="#dc2626",
on_primary="#ffffff",
on_danger="#ffffff",
),
)
Все настройки необязательны. По умолчанию используются title="Quite Admin",
description="", language="en" и нейтральная тёмно-серая тема с ярким синим акцентом.
Язык
language="en" включает английский, language="ru" — русский. Другие значения вызывают ValueError.
Переведены все встроенные экраны: вход, навигация, действия CRUD, пустые состояния,
пагинация, подписи логических значений, ошибки валидации и стандартные сообщения библиотеки.
Счётчики записей, таблиц и полей учитывают русские формы множественного числа.
Атрибут HTML lang соответствует выбранному языку.
Язык выбирается в конфигурации приложения. Автоматического определения по браузеру,
настроек языка пользователя и встроенного переключателя нет.
Несколько экземпляров админки в одном приложении могут иметь разные языки и темы.
При их размещении на одном хосте задавайте разные имена session_cookie.
Названия моделей и полей, подсказки, варианты enum, ошибки собственных адаптеров,
тексты своих страниц и значения записей задаёт приложение. Они не переводятся автоматически.
Для подписей используйте ModelOptions(label=...) и FieldOptions(label=..., help_text=...).
Переводятся только известные сообщения библиотеки; неизвестные ошибки показываются как переданы.
В формы по-прежнему отправляются true / false. Данные, URL и имена событий логирования не меняются.
В обоих языках интерфейса зарегистрированные модели называются таблицами: одинаковые
названия используются в навигации, на главной, в фильтрах истории и ссылках схемы. Для
просмотра записей выберите Список таблиц на главной или нажмите Найти таблицу. Существующие
собственные шаблоны могут продолжать использовать ключи t('Collections'),
t('Open collection') и tn('collection', 'collections', count); они показывают новые названия.
Python-идентификаторы, например Admin.configure(collection, ...), поля истории и параметры
фильтров с именем collection, а также URL /models/<slug>/ сохраняют совместимость.
Название и описание
title задаёт имя админки в заголовке браузера и основном заголовке главной
и страницы входа. На остальных страницах после входа логотип и название админки
показаны справа в шапке; хлебные крошки начинаются с текста Главная.
Версия библиотеки показывается в меню профиля.
description — обычный текст под названием на странице входа и под заголовком главной.
Он также попадает в HTML-метаданные описания. При пустом описании meta-тег и текст
описания под названием на главной не добавляются. Оба значения экранируются как текст.
logo — путь к существующему локальному SVG, PNG, JPEG, WebP или GIF.
Относительные пути вычисляются от рабочего каталога приложения. Изображение доступно по
маршруту /logo с учётом mount/proxy и показывается рядом с названием на главной,
на странице входа и справа в шапке остальных страниц после входа.
По умолчанию используется встроенный синий знак q, он же — favicon. Отсутствующий файл или неподдерживаемое расширение вызывают
ValueError. Свои шаблоны получают logo_url; внешние хосты и изменение CSP не нужны.
Цвета
Theme принимает цвета в шестнадцатеричном формате #RGB или #RRGGBB в любом регистре.
Некорректное значение вызывает ValueError при создании темы.
По умолчанию используется нейтральная тёмно-серая палитра с яркими синими акцентами.
Интерфейс сохраняет компактные контролы и карточку входа; логотип расположен рядом с названием. Обложка для GitHub —
отдельный файл репозитория; на странице входа она не отображается.
| Параметр | По умолчанию | Применение |
|---|---|---|
primary |
#3395fd |
Основные действия, выбранная навигация, активные поиск и сортировка |
background |
#181818 |
Основной фон страниц |
surface |
#202020 |
Полоса значков, шапка, карточки, поля ввода и панели |
text |
#fefefe |
Основной текст |
muted |
#b7b2bf |
Вторичный текст и подсказки |
border |
#3b3b45 |
Рамки и разделители |
danger |
#ff8798 |
Удаление и ошибки |
on_primary |
#111111 |
Текст основных кнопок |
on_danger |
#111111 |
Текст кнопок удаления |
Цвета наведения и тонированные фоны вычисляются из палитры. Подбирайте читаемые сочетания
текста и фона, в том числе on_primary и on_danger. Пример тёмной палитры:
theme = Theme(
primary="#93c5fd",
background="#0f172a",
surface="#172033",
text="#e2e8f0",
muted="#94a3b8",
border="#334155",
danger="#fca5a5",
on_primary="#0f172a",
on_danger="#450a0a",
)
Тема загружается с собственного маршрута админки /theme.css после основного CSS.
Префиксы монтирования и reverse proxy учитываются автоматически.
Встроенные стили, внешний CDN и JavaScript не нужны; политика style-src 'self' сохраняется.
Общая система интерфейса
Встроенные экраны используют общие компактную типографику, токены отступов и компоненты.
Сохранён системный стек шрифтов; скачивать шрифт не требуется. Скругления — 4 px у меток,
6 px у элементов управления и 8 px у панелей. Поверхности близки к фону страницы
и отделены рамками 1 px. Всплывающие панели отделяются от страницы тёмной тенью.
Высота строк таблицы задаётся токенами плотности; числовые столбцы выровнены вправо и используют табличные цифры.
Выбранная сортировка отмечена стрелкой направления и aria-sort; первый выбор столбца
сортирует по возрастанию. Панель поиска расположена над таблицей, а число записей — рядом с заголовком страницы.
SVG-звёздочка рядом с названием таблицы и звёздочки глобального поиска используют
общее состояние закрепления на главной. Кнопка × в недавних таблицах удаляет только
этот недавний переход; повторное открытие таблицы возвращает его. Ограничения
хранения в браузере и навигация описаны в обзоре интерфейса.
Активный поисковый запрос показан под панелью поиска. Сброс
возвращает на первую страницу, сохраняя сортировку и размер страницы. Ссылка на запись
доступна с клавиатуры, удаление открывает отдельное подтверждение. Наведение и фокус
выделяют текущую строку. Флажки выбирают записи текущей страницы; компактная иконка справа
открывает массовые действия. Логические значения показаны нейтральным
текстом: «Да» и «Нет» не означают успех и ошибку. Акцент обозначает действия
и выбор; красный — опасные действия и ошибки.
В форме обычные изменяемые поля, JSON, неизменяемые значения и связи разделены на секции
внутри одной поверхности. Кнопки сохранения и отмены остаются видимыми при прокрутке.
Встроенные элементы связывают подсказки и ошибки через aria-describedby, ошибочные поля
отмечены aria-invalid. Собственным шаблонам полей следует соблюдать тот же подход.
Пользовательские действия записи вынесены в секцию «Действия». На узких экранах форма
становится одноколоночной, полоса значков остаётся узкой, таблицы сохраняют
горизонтальную прокрутку для сравнения данных.
В собственных стилях с того же origin можно использовать общие токены:
| Токены | Назначение |
|---|---|
--text-xs, --text-sm, --text-base, --text-section, --text-title |
Шкала типографики |
--space-1 … --space-6, --space-8, --space-10 |
Отступы 3, 6, 10, 13, 16, 19, 26 и 32 px |
--radius-sm, --radius-control, --radius |
Скругления меток, элементов управления и поверхностей |
--bg, --paper, --subtle, --hover |
Фон страницы, поверхность, вложенный фон и состояние строки |
--line, --border, --control-height |
Рамки и общая высота элементов управления 31 px |
Существующие шаблоны, наследующие базовый, получают палитру и общие стили.
Для секций формы оберните каждый .form-grid в .form-section с подписанным заголовком.
.record-form задаёт внешние отступы поверхности, .form-footer — закреплённую область
кнопок. Свои переопределения можно сверить со встроенным form.html.
Свои шаблоны
Шаблоны, наследующие quite_admin/base.html, получают выбранные название, язык и цвета.
В общем контексте доступны title, description, language, theme, t и tn:
{% extends "quite_admin/base.html" %}
{% block content %}
<h1>{{ 'Отчёты' if language == 'ru' else 'Reports' }}</h1>
<p>{{ t('Save changes') }}</p>
<p>{{ total }} {{ tn('record', 'records', total) }}</p>
{% endblock %}
t(message, **values) и tn(singular, plural, count) используют встроенный словарь.
Для своих текстов нужен перевод приложения, как в заголовке выше.
В Python те же функции доступны через admin.gettext(...) и admin.ngettext(...).
В собственном CSS с того же origin используйте var(--accent), var(--paper), var(--text),
var(--muted), var(--line) и var(--danger), чтобы соблюдать выбранную палитру.
Регистрация описана в разделе своих страниц и шаблонов.
Подключение своего CSS, примеры плотности и границы замены шаблонов описаны
в разделе кастомизации оформления.