ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
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(一覧画面)の操作
一覧画面では 検索ボックス / フィルタサイドバー / カラム表示 / ページング / 一括選択 が表示されます。
一覧カラム制御
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(編集画面)の操作
編集画面の見た目は 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_fieldsets や get_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(削除)
削除確認画面では関連オブジェクトもツリー表示されます。誤削除を防ぐため、権限制御や 論理削除が推奨されます:
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_page | 1 ページ件数 | 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 = None か get_actions() で delete_selected をフィルタ除外。
Q: Inline で 0 件を許容したい
A: extra = 0 + min_num = 0。新規追加ボタンは残ります。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?