Атрибут actions

Атрибут actions класса ModelAdmin позволяет определять пользовательские действия, которые могут быть выполнены над выбранными объектами на странице списка в административной панели Django. Действия отображаются в выпадающем списке над таблицей с объектами и применяются к отмеченным записям.

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

Синтаксис

pythonfrom django.contrib import admin
from .models import Article

@admin.action(description="Описание действия")
def action_function(modeladmin, request, queryset):
  # Логика действия
  pass

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  actions = [action_function]

Пример

Давайте создадим действие, которое публикует выбранные статьи:

pythonfrom django.contrib import admin
from .models import Article

@admin.action(description="Опубликовать выбранные статьи")
def make_published(modeladmin, request, queryset):
  queryset.update(status="published")

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

После выбора нескольких статей и выполнения действия, их статус будет изменен на "published". Количество обновленных записей можно вывести пользователю:

pythonfrom django.contrib import admin
from .models import Article

@admin.action(description="Опубликовать выбранные статьи")
def make_published(modeladmin, request, queryset):
  updated = queryset.update(status="published")
  modeladmin.message_user(request, f"Опубликовано {updated} статей")

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

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

python"Опубликовано 5 статей"

Пример

Действие может выполнять более сложные операции, например, удалять объекты с отправкой уведомления:

pythonfrom django.contrib import admin
from django.shortcuts import redirect
from django.contrib import messages
from .models import Article

@admin.action(description="Удалить выбранные статьи с уведомлением")
def delete_with_notification(modeladmin, request, queryset):
  count = queryset.count()
  queryset.delete()
  modeladmin.message_user(
    request,
    f"Удалено {count} статей",
    messages.WARNING
  )

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
  list_display = ["title", "author"]
  actions = [delete_with_notification]

Пример

Действия могут выполняться с доступом к данным запроса, например, для обработки файлов или дополнительных параметров:

pythonfrom django.contrib import admin
from django.http import HttpResponse
import csv
from .models import Article

@admin.action(description="Экспортировать выбранные статьи в CSV")
def export_as_csv(modeladmin, request, queryset):
  response = HttpResponse(content_type="text/csv")
  response["Content-Disposition"] = "attachment; filename=articles.csv"
  writer = csv.writer(response)
  writer.writerow(["ID", "Title", "Status", "Created At"])
  for article in queryset:
    writer.writerow([
      article.id,
      article.title,
      article.status,
      article.created_at
    ])
  return response

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

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

  • декоратор admin.action,
    который добавляет описание действия
  • атрибут list_display,
    который определяет отображаемые поля в списке объектов
  • атрибут list_filter,
    который добавляет фильтры на страницу списка
  • атрибут search_fields,
    который определяет поля для поиска