4.

Django 管理サイト (admin) 完全ガイド

編集
この記事の要点
  • Django 管理サイトはモデル定義から自動で CRUD 管理画面を生成する Django の標準機能
  • 有効化 3 ステップ: ① python manage.py createsuperuser でスーパーユーザ作成 ② admin.pyadmin.site.register(Model)/admin/ へアクセス
  • ModelAdmin でカスタマイズ: list_display / list_filter / search_fields / fieldsets / inlines
  • 本番では URL を変える (/admin//secret-admin/) と総当たり攻撃対策
  • 見た目を変えたいなら django-grappelli / django-suit / django-jazzmin 等のテーマ

管理サイト有効化の最短手順

# 1. プロジェクト作成 (新規ならスキップ)
django-admin startproject mysite
cd mysite
python manage.py startapp blog

# 2. マイグレーション (admin / auth テーブル作成)
python manage.py migrate

# 3. スーパーユーザ作成
python manage.py createsuperuser
# Username: admin
# Email address: admin@example.com
# Password: ********
# Password (again): ********
# Superuser created successfully.

# 4. 開発サーバ起動
python manage.py runserver

# 5. ブラウザで http://127.0.0.1:8000/admin/ にアクセス

モデルを管理画面に表示する

# blog/models.py
from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class Post(models.Model):
    STATUS_CHOICES = [
        ('draft', '下書き'),
        ('published', '公開'),
    ]
    title = models.CharField(max_length=200)
    body = models.TextField()
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title
# blog/admin.py
from django.contrib import admin
from .models import Category, Post

# 最小: モデル登録だけ
admin.site.register(Category)
admin.site.register(Post)

これだけで /admin/blog/post/ から一覧 / 作成 / 編集 / 削除が可能になります。

ModelAdmin でカスタマイズ

# blog/admin.py
from django.contrib import admin
from .models import Category, Post


@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    # 一覧画面の表示カラム
    list_display = ('title', 'category', 'status', 'created_at')

    # 一覧で編集可能にするカラム
    list_editable = ('status',)

    # 右サイドのフィルタ
    list_filter = ('status', 'category', 'created_at')

    # 上部の検索ボックス対象
    search_fields = ('title', 'body')

    # 一覧ページ内ジャンプ
    list_per_page = 25

    # 並び順
    ordering = ('-created_at',)

    # 詳細画面のフィールド配置
    fieldsets = (
        ('基本情報', {
            'fields': ('title', 'category', 'status')
        }),
        ('本文', {
            'fields': ('body',),
            'classes': ('collapse',),   # 折りたたみ可能
        }),
    )

    # 編集不可フィールド
    readonly_fields = ('created_at',)

    # 日付ナビ
    date_hierarchy = 'created_at'

    # 一覧クリックでジャンプするカラム
    list_display_links = ('title',)


@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('name',)
    search_fields = ('name',)

Inline: 関連モデルを同じ画面で編集

# models.py に Comment 追加
class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    body = models.TextField()
    author = models.CharField(max_length=50)


# admin.py
class CommentInline(admin.TabularInline):    # またはアコーディオン形式の StackedInline
    model = Comment
    extra = 1                                # 空フォーム何個表示するか
    fields = ('author', 'body')
    readonly_fields = ()


@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'category', 'status')
    inlines = [CommentInline]                # ★ Post 編集画面に Comment 表が表示

actions: 一括操作

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ('title', 'status')
    actions = ['publish_selected', 'unpublish_selected']

    @admin.action(description='選択した記事を公開')
    def publish_selected(self, request, queryset):
        updated = queryset.update(status='published')
        self.message_user(request, f'{updated} 件公開しました')

    @admin.action(description='選択した記事を下書きへ')
    def unpublish_selected(self, request, queryset):
        queryset.update(status='draft')

外観カスタマイズ

# mysite/urls.py
from django.contrib import admin

admin.site.site_header = 'マイサイト 管理'        # ヘッダ
admin.site.site_title = 'マイサイト'              # ブラウザタイトル
admin.site.index_title = 'ダッシュボード'        # トップ見出し

# urls.py の中で本番は URL も変える
from django.urls import path
urlpatterns = [
    path('secret-admin/', admin.site.urls),       # /admin/ を別 URL に
]

権限とユーザー

Django の権限システムはモデルごとに add / change / delete / view の 4 権限を自動生成します。

# 管理サイトでユーザにグループ / 権限を割り当て可能

# プログラム側
from django.contrib.auth.models import User, Group, Permission

editor_group = Group.objects.create(name='Editor')
perm = Permission.objects.get(codename='change_post')
editor_group.permissions.add(perm)

user = User.objects.get(username='hanako')
user.groups.add(editor_group)
user.is_staff = True   # ★ /admin/ にログインできるようになる
user.save()

ModelAdmin の主要オプション一覧

オプション用途
list_display一覧カラム
list_filter右サイドフィルタ
search_fields検索対象
ordering並び順
list_per_pageページサイズ
fieldsets編集画面のフィールド配置
readonly_fields編集不可
inlines関連モデルインライン
actions一括操作
raw_id_fieldsFK を ID 検索フィールドに
autocomplete_fieldsFK をオートコンプリートに
prepopulated_fieldsslug 自動生成
date_hierarchy日付ナビ

サードパーティテーマ

パッケージ特徴
django-grappelliDjango 公式が古くから推奨、洗練された UI
django-suitBootstrap ベース
django-jazzminモダン、AdminLTE ベース、設定豊富
django-admin-interfaceテーマ切替がリアルタイム
django-unfoldTailwind ベース、新しめ
# 例: jazzmin
pip install django-jazzmin

# settings.py の INSTALLED_APPS で django.contrib.admin より前に
INSTALLED_APPS = [
    'jazzmin',
    'django.contrib.admin',
    ...
]

本番運用の注意

  • /admin/ URL は変更する (総当たり対策)
  • DEBUG = FalseALLOWED_HOSTS 設定
  • HTTPS 必須 (SECURE_SSL_REDIRECT = True)
  • SESSION_COOKIE_SECURE = True / CSRF_COOKIE_SECURE = True
  • スーパーユーザは最小限、業務用は staff + groups で権限制御
  • ログイン失敗回数制限は django-axes 等で

FAQ

Q: 管理画面で日本語が出ない
A: settings.pyLANGUAGE_CODE = 'ja' / USE_I18N = True

Q: 管理画面に独自ページを追加したい
A: admin.site.get_urls() をオーバーライドするか、ModelAdminget_urls() を拡張する。

Q: ManyToMany を見やすくしたい
A: filter_horizontal または filter_verticalautocomplete_fields でも可。

編集
Post Share
子ページ
  1. ユーザーの作成
  2. サイトへのアクセス
  3. アプリケーションの登録
  4. オブジェクトの操作
同階層のページ
  1. 環境構築とプロジェクト/アプリの作成
  2. MVC(MVT)のそれぞれの使い方と説明
  3. データベースへの接続と操作
  4. Django Administration
  5. git管理
  6. エラー一覧
  7. バージョンの確認方法
  8. ログ出力方法
  9. SQLのログ出力方法
  10. ログのローテート設定
  11. settings.pyの定数にアクセスする方法
  12. 本番環境へのインストールとアプリのデプロイ(apache編)
  13. 本番環境へのインストールとアプリのデプロイ(nginx編)
  14. djangoアプリの本番の開始URLを変更する
  15. 静的(static)ファイルの置き場所と読み込み(画像、css、js )
  16. CSRFトークンをAjaxで使用する方法
  17. ajaxの使用例(POST編)
  18. ファイルのアップロードとファイルの名前
  19. クイックスタート/チュートリアル
  20. ログイン機能
  21. テンプレート側のログイン判定
  22. ビュー側のログイン判定
  23. 管理者ユーザーの作成/判定と管理画面
  24. モデルのjson化とレスポンス
  25. runserverでポートを指定する方法
  26. cronによるバッチ実行
  27. テンプレートで利用する共通のcontextを定義する方法
  28. プログラムが本番サーバーで反映されない場合の対処法
  29. APIの作成
  30. cron用コマンド・ファイルの作成