ModelAdmin
ChassisAdminMixin — точка входа ModelAdmin. Ставьте его первым в MRO. Возможности
подключаются через options.
from django.contrib.admin import ModelAdmin
from django_chassis.mixins import ChassisAdminMixin
from django_chassis.options import RowActionsOption, SearchOption, Settings
class BookAdmin(ChassisAdminMixin, ModelAdmin):
chassis_settings = Settings(search_collapsed=True, allow_standard_add=True)
options = [SearchOption(fields=['title']), RowActionsOption()]
MRO
class BookAdmin(ChassisAdminMixin, ModelAdmin): # correct
...
class BookAdmin(ModelAdmin, ChassisAdminMixin): # wrong — hooks will not wrap super()
...
То же правило для ReadOnlyAdminMixin и NoDeleteAdminMixin: они должны
стоять так, чтобы их переопределения has_*_permission всё равно вызывались.
Анатомия change form
Шаблон: admin/chassis/change_form.html (наследует
admin/change_form.html).
┌─ breadcrumbs ─────────────────────────────────────────────┐
│ Dashboard › раздел › модель › объект │
├─ тулбар (`page_actions`) ─────────────────────────────────┤
│ [кнопки @object_action…] [история Django / …] │
├─ fieldsets / inlines Django ──────────────────────────────┤
│ Pretty JSON / decimal / маски дат │
├─ связанные сущности (`after_field_sets`) ─────────────────┤
│ по одному fieldset на RelatedEntityOption │
├─ submit row ──────────────────────────────────────────────┤
│ [Сохранить] [Назад] [Удалить] │
└───────────────────────────────────────────────────────────┘
Объектные действия требуют ObjectActionsOption и @object_action на
методах. Связанные таблицы — RelatedEntitiesOption. См.
Объектные действия и
Связанные сущности.
Первая колонка changelist по умолчанию не ссылка. На эту страницу
попадают через row action (RowActionType.VIEW или CHANGE).
Как резолвит get_chassis_option
- Идёт по
self.optionsи возвращает первый экземпляр запрошенного типа. - Если нет — по
ChassisAdminMixin.options(сейчас:RowActionsOption()по умолчанию). - Составные вещи (несколько FK-групп, несколько row actions) живут внутри одного option.
Два SearchOption не сливаются. Локальный побеждает.
options
options — список frozen dataclass. Не переименовывайте этот атрибут.
Полные таблицы полей, валидация и регионы UI: каталог options.
AdminOption — объединение:
SearchOptionFiltersOptionDateHierarchyOptionFieldTabsOptionForeignKeyTabsOptionBadgeFieldsOptionDecimalAmountOptionPrettyJsonOptionRowActionsOptionListActionsOptionObjectActionsOptionRelatedEntitiesOptionImportOptionExportOption
Значение по умолчанию миксина — [RowActionsOption()]. Если задаёте
options сами, включите RowActionsOption, когда нужны кнопки в последней
колонке.
Settings
Не option. Задаётся на chassis_settings.
| Параметр | По умолчанию | Назначение |
|---|---|---|
search_collapsed | True | Начинать со свёрнутого fieldset поиска |
date_hierarchy_collapsed | True | Свернуть fieldset date hierarchy |
filters_collapsed | True | Свернуть fieldset фильтров |
allow_standard_add | True | При False has_add_permission() возвращает False |
Другие атрибуты миксина
| Атрибут | По умолчанию | Назначение |
|---|---|---|
change_list_template | admin/chassis/change_list.html | Changelist Chassis |
change_form_template | admin/chassis/change_form.html | Форма изменения Chassis |
chassis_link_first_column | False | Первая колонка не ссылка на change |
Row actions — основной вход в объект. Ставьте
chassis_link_first_column = True только если нужна классическая ссылка
Django в первой колонке.
Сопутствующие миксины
ReadOnlyAdminMixin— запрещает add, change и deleteNoDeleteAdminMixin— запрещает delete
Ставьте deny-миксин перед ChassisAdminMixin, чтобы его has_*_permission
выиграли в MRO:
class LogAdmin(ReadOnlyAdminMixin, ChassisAdminMixin, ModelAdmin):
options = [SearchOption(fields=['message'])]
System checks
ChassisAdminMixin проверяет права действий и lookup export. Ошибки видны как
system checks Django, а не как тихие дыры в шаблонах.