Декоратор admin.action

Декоратор admin.action применяется к функциям, которые определяют пользовательские действия для административной панели Django. Действия отображаются в выпадающем списке на странице списка объектов модели и позволяют выполнять операции над выбранными записями. Декоратор принимает параметр description, который задает текст действия в интерфейсе администратора. Функция действия принимает три аргумента: modeladmin - экземпляр класса администратора, request - объект HTTP-запроса и queryset - набор выбранных объектов.

Синтаксис

pythonfrom django.contrib import admin

@admin.action(description="Description text")
def action_name(modeladmin, request, queryset):
  # Perform action on queryset
  queryset.update(field=value)

Пример

Создадим действие для массовой публикации статей. Действие будет изменять статус выбранных статей на "published":

pythonfrom django.contrib import admin
from myapp.models import Article

@admin.action(description="Publish selected articles")
def publish_articles(modeladmin, request, queryset):
  updated = queryset.update(status="published")
  modeladmin.message_user(
    request,
    f"{updated} articles were successfully published."
  )

Результат выполнения действия:

python"5 articles were successfully published."

Пример

Добавим действие для архивации выбранных пользователей. Также укажем параметр permissions для ограничения доступа к действию:

pythonfrom django.contrib import admin
from myapp.models import User

@admin.action(
  description="Archive selected users",
  permissions=["change"],
)
def archive_users(modeladmin, request, queryset):
  updated = queryset.update(is_active=False)
  modeladmin.message_user(
    request,
    f"{updated} users were archived.",
    level="WARNING",
  )

Результат выполнения кода:

python"3 users were archived."

Пример

Регистрация действия в классе ModelAdmin с использованием атрибута actions:

pythonfrom django.contrib import admin
from myapp.models import Article

@admin.action(description="Publish selected articles")
def publish_articles(modeladmin, request, queryset):
  updated = queryset.update(status="published")
  modeladmin.message_user(
    request,
    f"{updated} articles published."
  )

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  list_display = ["title", "status", "created_at"]
  actions = [publish_articles]

Смотрите также

  • декоратор admin.register,
    который регистрирует модель в административной панели
  • атрибут actions,
    который определяет список доступных действий для модели
  • класс ModelAdmin,
    который настраивает отображение модели в административной панели
  • декоратор admin.display,
    который настраивает отображение полей в списке объектов