Атрибут actions
Атрибут actions класса ModelAdmin позволяет определять пользовательские действия, которые могут быть выполнены над выбранными объектами на странице списка в административной панели Django. Действия отображаются в выпадающем списке над таблицей с объектами и применяются к отмеченным записям.
Каждое действие представляет собой функцию, которая принимает три параметра: modeladmin - текущий экземпляр ModelAdmin, request - объект HTTP-запроса и queryset - набор выбранных объектов. Функция должна возвращать None или объект ответа.
Синтаксис
from 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]
Пример
Давайте создадим действие, которое публикует выбранные статьи:
from 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". Количество обновленных записей можно вывести пользователю:
from 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]
Результат выполнения кода:
"Опубликовано 5 статей"
Пример
Действие может выполнять более сложные операции, например, удалять объекты с отправкой уведомления:
from 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]
Пример
Действия могут выполняться с доступом к данным запроса, например, для обработки файлов или дополнительных параметров:
from 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,
который определяет поля для поиска