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

Объектные действия

Добавлено в 1.0.1

Объектные действия — методы ModelAdmin, которые работают с одним объектом. Регистрируйте их через @object_action и перечисляйте имена в ObjectActionsOption.

Изменено в 1.0.7

Действие может содержать иконку из поставляемого Chassis набора Font Awesome.

Добавлено в 1.0.15

Укажите opens_modal=True, чтобы загружать ответ действия через общий modal- клиент Chassis. Действие сохраняет штатную компактную цветную кнопку, а его href остаётся доступной fallback-ссылкой.

from django.contrib import messages
from django.http import HttpRequest, HttpResponseRedirect
from django.utils.translation import gettext_lazy as _

from django_chassis.decorators import object_action
from django_chassis.enums import ButtonColor
from django_chassis.mixins import ChassisAdminMixin
from django_chassis.options import ObjectActionsDropdownOption, ObjectActionsOption


class BookAdmin(ChassisAdminMixin, ModelAdmin):
options = [
ObjectActionsOption(
actions=['publish'],
dropdown=ObjectActionsDropdownOption(actions=['archive'])
)
]

@object_action(
description=_('Publish'),
permission='change',
confirmation=_('Publish this book?'),
color=ButtonColor.SUCCESS,
icon_class='fa-solid fa-bullhorn',
opens_modal=True
)
def publish(self, request: HttpRequest, obj: Book) -> HttpResponseRedirect | None:
obj.publish()
messages.success(request, _('Published.'))
return None

Декоратор​

@object_action(
description,
*,
permission=None,
confirmation=None,
color=ButtonColor.PRIMARY,
icon_class=None,
opens_modal=False,
condition=None,
condition_method=None,
)
ПараметрНазначение
descriptionПодпись кнопки (допустимы lazy-строки)
permissionview / add / change / delete или свой codename
confirmationЕсли задано, Chassis показывает форму подтверждения до вызова метода
colorButtonColor
icon_classНеобязательные CSS-классы Font Awesome перед подписью
opens_modalЗагрузить ответ действия в общем modal Chassis
conditioncallable(admin, request, obj) -> bool
condition_methodИмя @classmethod, вызываемого как (request, obj)

condition и condition_method взаимоисключающие.

Сигнатура метода — (self, request, obj). Верните HttpResponse, чтобы перенаправить или отрисовать страницу, или None, чтобы остаться на странице объекта.

Маршрут (ModelAdmin):

{admin}/{app}/{model}/{object_id}/actions/{action_name}/

Имя URL: {app}_{model}_object_action. Permission и condition проверяются повторно на этом запросе, не только при отрисовке кнопки. AdminObjectPage использует тот же декоратор на карточке без модели — см. Свои страницы.

ObjectActionsOption​

ObjectActionsOption(
actions=['publish'],
dropdown=ObjectActionsDropdownOption(actions=['archive'])
)

Наружу выходят только перечисленные имена. Недекорированный метод в списке ломает конфигурацию.

Добавлено в 1.0.7

dropdown явно помещает перечисленные действия в основное меню «Дополнительные действия». Имена должны быть уникальны одновременно в actions и dropdown.actions; пустой dropdown недопустим. Независимо от явной группировки Chassis автоматически сворачивает шесть и более видимых действий в одно меню, а пять и меньше оставляет отдельными кнопками.

Подтверждение​

Если задан confirmation, Chassis рендерит admin/chassis/confirmed_action.html с ConfirmedActionForm. Метод вызывается только после POST-подтверждения.

Шаблоны object actions, расширяющие admin/object_actions/base_action_view.html, теперь используют общую оболочку страницы Chassis и размещают содержимое в блоке object_action_content. Оболочка предоставляет компактные стили форм, information table, предупреждений и кнопок действий. Страницы действий используют всю ширину контента. Нижняя панель выровнена вправо и содержит общую кнопку «Назад»; ошибки валидации собраны в общем danger alert, а обязательный checkbox подтверждения выводится после остальных полей.

См. также​