Djangoの管理画面、非常に便利ですよね。
Django Adminでは自作したアクションも使えるので便利です。

こんな感じで。
今回はこのアクションのカスタマイズ方法を紹介します。
なお、この記事で使うPython・Djangoのバージョンは以下のとおりです。
Python 3.7
Django 2.2.5
この記事の目次
アクションの追加方法
以下の様なモデルとadmin.pyを用意。
from django.db import models
class Book(models.Model):
title = models.CharField(verbose_name='タイトル', max_length=255)
author = models.CharField(verbose_name='著者', max_length=255)
class Meta:
db_table = 'book'
verbose_name = verbose_name_plural = "書籍"
from django.contrib import admin
from .models import Book
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'author')
追加前の管理画面はこんな感じ。

デフォルトで Delete select my models アクションが設定される。
これは選択したレコードを削除するアクション。
このアクションの消し方はこちらを参照。
さて本題。
change_title_action というアクションを追加。
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'author')
actions = ['change_title_action'] # 追加するアクションの関数を指定
# 追加するアクションの関数
def change_title_action(self, request, queryset): # 引数はこれがデフォルト
queryset.update(title='マンガ')
change_title_action.short_description = 'タイトルをマンガに変更' # アクションの名前

ちゃんと自作のアクションが追加された。
このアクションは選択した本レコードのタイトルをマンガに変更するもの。


レコードの値を使いたい場合
アクション内でレコードの値を使いたい場合は、 queryset からループなどで取り出す。
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'author')
actions = ['change_title_action']
def change_title_action(self, request, queryset):
for obj in queryset: # querysetからオブジェクトを取り出す
obj.title = "【必見】" + obj.title
obj.save() # オブジェクトを保存してレコードのタイトルを更新
change_title_action.short_description = 'タイトルの前に【必見】を追加'


アクションを追加してもっと高度なカスタマイズはできますが、それは次回の記事で。