ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
管理サイト有効化の最短手順
# 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_fields | FK を ID 検索フィールドに |
autocomplete_fields | FK をオートコンプリートに |
prepopulated_fields | slug 自動生成 |
date_hierarchy | 日付ナビ |
サードパーティテーマ
| パッケージ | 特徴 |
|---|---|
| django-grappelli | Django 公式が古くから推奨、洗練された UI |
| django-suit | Bootstrap ベース |
| django-jazzmin | モダン、AdminLTE ベース、設定豊富 |
| django-admin-interface | テーマ切替がリアルタイム |
| django-unfold | Tailwind ベース、新しめ |
# 例: jazzmin
pip install django-jazzmin
# settings.py の INSTALLED_APPS で django.contrib.admin より前に
INSTALLED_APPS = [
'jazzmin',
'django.contrib.admin',
...
]
本番運用の注意
/admin/URL は変更する (総当たり対策)DEBUG = False、ALLOWED_HOSTS設定- HTTPS 必須 (
SECURE_SSL_REDIRECT = True) SESSION_COOKIE_SECURE = True/CSRF_COOKIE_SECURE = True- スーパーユーザは最小限、業務用は staff + groups で権限制御
- ログイン失敗回数制限は django-axes 等で
FAQ
Q: 管理画面で日本語が出ない
A: settings.py で LANGUAGE_CODE = 'ja' / USE_I18N = True。
Q: 管理画面に独自ページを追加したい
A: admin.site.get_urls() をオーバーライドするか、ModelAdmin の get_urls() を拡張する。
Q: ManyToMany を見やすくしたい
A: filter_horizontal または filter_vertical。autocomplete_fields でも可。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
同階層のページ
- 環境構築とプロジェクト/アプリの作成
- MVC(MVT)のそれぞれの使い方と説明
- データベースへの接続と操作
- Django Administration
- git管理
- エラー一覧
- バージョンの確認方法
- ログ出力方法
- SQLのログ出力方法
- ログのローテート設定
- settings.pyの定数にアクセスする方法
- 本番環境へのインストールとアプリのデプロイ(apache編)
- 本番環境へのインストールとアプリのデプロイ(nginx編)
- djangoアプリの本番の開始URLを変更する
- 静的(static)ファイルの置き場所と読み込み(画像、css、js )
- CSRFトークンをAjaxで使用する方法
- ajaxの使用例(POST編)
- ファイルのアップロードとファイルの名前
- クイックスタート/チュートリアル
- ログイン機能
- テンプレート側のログイン判定
- ビュー側のログイン判定
- 管理者ユーザーの作成/判定と管理画面
- モデルのjson化とレスポンス
- runserverでポートを指定する方法
- cronによるバッチ実行
- テンプレートで利用する共通のcontextを定義する方法
- プログラムが本番サーバーで反映されない場合の対処法
- APIの作成
- cron用コマンド・ファイルの作成
人気ページ
- 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アノテーションとは
最近更新/作成されたページ
- Laravel キャッシュクリア完全ガイド(cache:clear / config:clear / 2026-05-18 07:42:07
- プロジェクトの作成と削除 2026-05-18 07:42:07
- インストール直後にNetbeansが反応しない 2026-05-18 07:42:07
- 動画やチャンネルの検索 2026-05-18 07:42:07
- APIキー取得方法 2026-05-18 07:42:07
- チャンネル情報の取得 2026-05-18 07:42:07
- API 入門 — Web API(REST / GraphQL / gRPC / 2026-05-18 07:42:07
- インストール(eclipseプラグイン) 2026-05-18 07:42:07
- Laravel「Dotenv values containing spaces must be surrounded 2026-05-18 07:42:07
- エラー一覧 2026-05-18 07:42:07
- curl: (51) SSL: certificate subject name '~' does not match 2026-05-18 07:42:07
- インストール方法(Windows版) 2026-05-18 07:42:07
- JSONから配列に変換 2026-05-18 07:42:07
- 処理を一定時間待つ 2026-05-18 07:42:07
- A non well formed numeric value encountered 2026-05-18 07:42:07
コメントを削除してもよろしいでしょうか?