4.

Django Admin オブジェクト操作完全ガイド (ListView / ChangeView / Inline / Actions)

編集
この記事の要点
  • Django Admin のオブジェクト操作は ChangeList(一覧)/ ChangeForm(編集)/ Delete の 3 画面で構成
  • list_display / list_filter / search_fields / ordering で一覧の見せ方をカスタマイズ
  • ModelAdmin を継承し admin.site.register(Model, MyAdmin) で登録
  • InlineModelAdmin で親子モデルを同一画面で編集可能 (StackedInline / TabularInline)
  • actions でチェック済オブジェクトに対する一括処理(公開/非公開切替など)を実装

Django Admin オブジェクト操作の全体像

Django の管理サイト(Admin)では、登録された各モデルに対して 4 つの基本操作が用意されます:

  • ChangeList View(一覧) — 検索・フィルタ・並び替え・ページング
  • Add View(追加) — 新規レコード作成フォーム
  • Change View(編集) — 既存レコード編集フォーム
  • Delete View(削除) — 削除確認画面

これらは admin.ModelAdmin を継承したクラスで挙動を制御できます。

最小構成: モデル登録

# myapp/admin.py
from django.contrib import admin
from .models import Article

# シンプル登録
admin.site.register(Article)

# カスタマイズして登録(推奨)
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display  = ('title', 'author', 'status', 'created_at')
    list_filter   = ('status', 'author')
    search_fields = ('title', 'body')
    ordering      = ('-created_at',)

ChangeList View(一覧画面)の操作

一覧画面では 検索ボックス / フィルタサイドバー / カラム表示 / ページング / 一括選択 が表示されます。

Django Admin ChangeList

一覧カラム制御

class ArticleAdmin(admin.ModelAdmin):
    # 表示カラム(メソッド名も指定可)
    list_display = ('title', 'author', 'status', 'word_count', 'created_at')

    # クリックして編集画面に遷移するカラム
    list_display_links = ('title',)

    # 一覧で直接編集可能にする
    list_editable = ('status',)

    # 表示件数
    list_per_page = 25
    list_max_show_all = 200

    # 計算カラム
    @admin.display(description='文字数', ordering='body')
    def word_count(self, obj):
        return len(obj.body or '')

フィルタ・検索・並び替え

class ArticleAdmin(admin.ModelAdmin):
    # 右サイドバーにフィルタ
    list_filter = ('status', 'author', 'created_at')

    # 検索ボックス(部分一致)
    search_fields = ('title', 'body', 'author__username')
    # ^title : 前方一致 / =title : 完全一致 / @title : 全文検索

    # 並び替え
    ordering = ('-created_at',)

    # 日付ドリルダウン
    date_hierarchy = 'created_at'

Change View(編集画面)の操作

Django Admin ChangeForm

編集画面の見た目は fields / fieldsets / readonly_fields で制御します:

class ArticleAdmin(admin.ModelAdmin):
    # シンプル: フィールド順を指定
    fields = ('title', 'author', 'body', 'status')

    # 高度: セクション分け
    fieldsets = (
        ('基本情報', {
            'fields': ('title', 'author'),
        }),
        ('本文', {
            'fields': ('body', 'summary'),
            'classes': ('wide',),
        }),
        ('公開設定', {
            'fields': ('status', 'published_at'),
            'classes': ('collapse',),  # 折り畳み
        }),
    )

    # 読み取り専用
    readonly_fields = ('created_at', 'updated_at')

    # 大量データの ForeignKey は raw_id_fields で軽く
    raw_id_fields = ('author',)

    # 多 ToMany は filter_horizontal で UI 向上
    filter_horizontal = ('tags',)

Add View(追加画面)

追加画面は基本的に編集画面と同じレイアウトです。add_fieldsetsget_form() で追加時専用の挙動を変えられます:

class UserAdmin(admin.ModelAdmin):
    # ユーザー追加時のみパスワード入力フィールドを表示
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'password1', 'password2'),
        }),
    )

    def get_fieldsets(self, request, obj=None):
        if not obj:
            return self.add_fieldsets
        return super().get_fieldsets(request, obj)

Delete View(削除)

Django Admin Delete

削除確認画面では関連オブジェクトもツリー表示されます。誤削除を防ぐため、権限制御論理削除が推奨されます:

class ArticleAdmin(admin.ModelAdmin):
    # 削除ボタンを隠す
    def has_delete_permission(self, request, obj=None):
        return request.user.is_superuser

    # 一括 Delete アクションを外す
    actions = None  # または get_actions で個別削除

InlineModelAdmin(親子モデルを同画面で編集)

1 対多 / 多対多リレーションを親画面に埋め込むのが Inline です:

from django.contrib import admin
from .models import Article, Comment

class CommentInline(admin.TabularInline):    # テーブル形式
    model = Comment
    extra = 1                 # 空行を 1 つ追加
    max_num = 10
    fields = ('author', 'body', 'created_at')
    readonly_fields = ('created_at',)

# class CommentInline(admin.StackedInline):  # 縦並び(スタック)

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    inlines = [CommentInline]

Actions(一括処理)

一覧で選択したオブジェクトに対するカスタム処理を定義できます:

from django.contrib import admin

@admin.action(description='選択した記事を公開状態にする')
def make_published(modeladmin, request, queryset):
    updated = queryset.update(status='published')
    modeladmin.message_user(request, f'{updated} 件を公開しました')

@admin.action(description='下書きに戻す')
def make_draft(modeladmin, request, queryset):
    queryset.update(status='draft')

class ArticleAdmin(admin.ModelAdmin):
    actions = [make_published, make_draft]

カスタマイズ可能な主な属性

属性役割
list_display一覧カラム('title', 'author')
list_filter右サイドバーフィルタ('status', 'created_at')
search_fields検索ボックス対象('title', 'body')
orderingデフォルト並び順('-created_at',)
list_per_page1 ページ件数25
date_hierarchy日付ドリルダウン'created_at'
raw_id_fields大量データの FK 入力('author',)
readonly_fields読取専用('updated_at',)
fieldsets編集画面セクション分け後述
inlines関連モデル同画面編集[CommentInline]
actions一括処理[make_published]
save_on_top上部にも保存ボタンTrue

権限と保存フックのカスタマイズ

class ArticleAdmin(admin.ModelAdmin):
    def has_add_permission(self, request):
        return request.user.has_perm('myapp.add_article')

    def has_change_permission(self, request, obj=None):
        if obj and obj.author != request.user and not request.user.is_superuser:
            return False
        return True

    def save_model(self, request, obj, form, change):
        if not change:
            obj.author = request.user  # 新規時に著者自動セット
        super().save_model(request, obj, form, change)

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(author=request.user)  # 自分の記事だけ

FAQ

Q: list_editable を使うと並び順が変わる
A: list_display_links を必ず指定してください。リンクと編集の両方ないカラムだけが list_editable 候補です。

Q: 一覧画面で関連モデルのカラムを表示したい
A: list_display = ('title', 'author__username') は不可。メソッドで返してください: def author_name(self, obj): return obj.author.username

Q: 一括削除を防ぎたい
A: actions = Noneget_actions()delete_selected をフィルタ除外。

Q: Inline で 0 件を許容したい
A: extra = 0 + min_num = 0。新規追加ボタンは残ります。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ユーザーの作成
  2. Django 管理サイト (Administration) へのアクセス方法
  3. アプリケーションの登録
  4. オブジェクトの操作

最近更新/作成されたページ