Перейти к основному содержимому

ModelAdmin

Добавлено в 1.0.1

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

  1. Идёт по self.options и возвращает первый экземпляр запрошенного типа.
  2. Если нет — по ChassisAdminMixin.options (сейчас: RowActionsOption() по умолчанию).
  3. Составные вещи (несколько FK-групп, несколько row actions) живут внутри одного option.

Два SearchOption не сливаются. Локальный побеждает.

options

options — список frozen dataclass. Не переименовывайте этот атрибут.

Полные таблицы полей, валидация и регионы UI: каталог options.

AdminOption — объединение:

  • SearchOption
  • FiltersOption
  • DateHierarchyOption
  • FieldTabsOption
  • ForeignKeyTabsOption
  • BadgeFieldsOption
  • DecimalAmountOption
  • PrettyJsonOption
  • RowActionsOption
  • ListActionsOption
  • ObjectActionsOption
  • RelatedEntitiesOption
  • ImportOption
  • ExportOption

Значение по умолчанию миксина — [RowActionsOption()]. Если задаёте options сами, включите RowActionsOption, когда нужны кнопки в последней колонке.

Settings

Не option. Задаётся на chassis_settings.

ПараметрПо умолчаниюНазначение
search_collapsedTrueНачинать со свёрнутого fieldset поиска
date_hierarchy_collapsedTrueСвернуть fieldset date hierarchy
filters_collapsedTrueСвернуть fieldset фильтров
allow_standard_addTrueПри False has_add_permission() возвращает False

Другие атрибуты миксина

АтрибутПо умолчаниюНазначение
change_list_templateadmin/chassis/change_list.htmlChangelist Chassis
change_form_templateadmin/chassis/change_form.htmlФорма изменения Chassis
chassis_link_first_columnFalseПервая колонка не ссылка на change

Row actions — основной вход в объект. Ставьте chassis_link_first_column = True только если нужна классическая ссылка Django в первой колонке.

Сопутствующие миксины

  • ReadOnlyAdminMixin — запрещает add, change и delete
  • NoDeleteAdminMixin — запрещает delete

Ставьте deny-миксин перед ChassisAdminMixin, чтобы его has_*_permission выиграли в MRO:

class LogAdmin(ReadOnlyAdminMixin, ChassisAdminMixin, ModelAdmin):
options = [SearchOption(fields=['message'])]

System checks

ChassisAdminMixin проверяет права действий и lookup export. Ошибки видны как system checks Django, а не как тихие дыры в шаблонах.

См. также