【Django】Adminで簡単にアクションを追加する

django-admin-action-title CODE

Djangoの管理画面、非常に便利ですよね。

Django Adminでは自作したアクションも使えるので便利です。

Djangoアクション追加後

こんな感じで。

今回はこのアクションのカスタマイズ方法を紹介します。

なお、この記事で使う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')

追加前の管理画面はこんな感じ。

Djangoアクション追加前

デフォルトで  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 = 'タイトルをマンガに変更'  # アクションの名前
Djangoアクション追加後

ちゃんと自作のアクションが追加された。

このアクションは選択した本レコードのタイトルをマンガに変更するもの。

Djangoアクション追加2
Djangoアクション実行後

レコードの値を使いたい場合

アクション内でレコードの値を使いたい場合は、 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 = 'タイトルの前に【必見】を追加'
Djangoアクション実行前
Djangoアクション実行後

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