Объектные действия
Объектные действия — методы ModelAdmin, которые работают с одним объектом.
Регистрируйте их через @object_action и перечисляйте имена в
ObjectActionsOption.
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 ObjectActionsOption
class BookAdmin(ChassisAdminMixin, ModelAdmin):
options = [ObjectActionsOption(actions=['publish'])]
@object_action(
description=_('Publish'), permission='change', confirmation=_('Publish this book?'), color=ButtonColor.SUCCESS
)
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,
condition=None,
condition_method=None,
)
| Параметр | Назначение |
|---|---|
description | Подпись кнопки (допустимы lazy-строки) |
permission | view / add / change / delete или свой codename |
confirmation | Если задано, Chassis показывает форму подтверждения до вызова метода |
color | ButtonColor |
condition | callable(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', 'archive'])
Наружу выходят только перечисленные имена. Недекорированный метод в списке ломает конфигурацию.
Подтверждение
Если задан confirmation, Chassis рендерит
admin/chassis/confirmed_action.html с ConfirmedActionForm. Метод
вызывается только после POST-подтверждения.