3. Django プロジェクトを始める

3.1. この章で学ぶこと

  • Django とは何か、なぜ選ばれるのか

  • Django プロジェクトの作成(LLM と一緒に)

  • Django の構造理解(MTV)

  • Hello World 表示

  • 管理画面

  • つまずきポイント集

  • ゲーム用プロジェクトの整理

  • Git へのコミット


3.2. イントロダクション

環境構築が完了したら、いよいよコードを書き始めます!

この章では、Djangoという魔法の杖を手に入れます。Djangoは「バッテリー同梱(Batteries Included)」と呼ばれる、必要な機能が最初から全て揃っているフレームワークです。

「バッテリー同梱」とは?

「バッテリー同梱」とは、電池が最初から付属しているおもちゃのように、「買ってすぐ使える」ことを表すプログラミング界の慣用表現です。つまり、Webアプリに必要なものがほとんど最初から揃っています。

認証、データベース、管理画面、フォーム処理…これらを一から作ると何ヶ月もかかりますが、Djangoなら数分で準備できます。

まずは、Djangoの"Hello, World!"を表示させて、成功体験を積みましょう。

Tip

この章のゴール

  • [√] Djangoプロジェクトを作成

  • [√] 開発サーバーを起動

  • [√] ブラウザで"Hello, World!"を表示

  • [√] Djangoの基本構造を理解

所要時間: 約1.5時間


3.3. Django とは

3.3.1. Web フレームワークって何?

Web アプリを作るとき、毎回ゼロから作るのは大変です。どのアプリにも共通する機能があります:

  • URL にアクセスしたら、対応するページを表示

  • データベースからデータを取得

  • HTML を生成してブラウザに返す

  • ユーザーの入力を受け取って処理

これらの「よくある処理」をまとめたのがWeb フレームワークです。

3.3.2. Django の特徴

Django は 2005 年に生まれた、Python で最も人気のある Web フレームワークの一つです。

Django が選ばれる理由:

  1. バッテリー同梱(Batteries Included)

    • 必要な機能がほとんど最初から入っている

    • 別途ライブラリを探す手間が少ない

  2. 管理画面が自動生成

    • データベースの CRUD 操作が管理画面でできる

    • 非エンジニアでもデータを編集可能

  3. セキュアなデフォルト設定

    • SQL インジェクション、XSS、CSRF などの対策が組み込み

    • 初心者でも安全なアプリが作れる

  4. ORM(Object-Relational Mapping)

    • SQL を書かずにデータベース操作

    • Python のコードでデータベースを扱える

  5. 大規模でも使える

    • Instagram、Pinterest、NASA など、大手サービスでも採用

    • スケーラビリティが実証済み

注釈

バッテリー同梱

「バッテリー同梱」とは、電池が最初から入っているおもちゃや、箱を開けてすぐ使えるスマホアクセサリーのように、「買ってすぐ使える」ことを表すプログラミング界の慣用表現です。

Django を使った有名サービス:

  • Instagram(写真共有)

  • Pinterest(画像ブックマーク)

  • Spotify(音楽ストリーミング)

  • Dropbox(ファイル共有)

3.3.3. Django の MTV 構造

Django は MTV(Model-Template-View) という設計パターンを採用しています。

diagram

各要素の役割:

  • Model(モデル): データベースとのやり取り

    • データの構造を定義

    • データの保存、取得、更新、削除

  • Template(テンプレート): 表示

    • HTML ファイル

    • Python の変数を埋め込める

  • View(ビュー): ロジック

    • Model からデータをとってきて Template に渡す

    • ユーザーの入力を処理

注釈

他のフレームワークとの用語の違い

Ruby on Rails や Laravel など、他のフレームワークでは MVC(Model-View-Controller) と呼ばれます。

Django の MTV と MVC の対応:

  • Django Model = MVC Model

  • Django Template = MVC View

  • Django View = MVC Controller

用語が違うだけで、やっていることは同じです。


3.4. プロジェクト作成(LLM と一緒に)

さあ、実際に Django プロジェクトを作りましょう。

3.4.1. 作業ディレクトリの準備

まず、ターミナルを起動します。

Windows の場合:

  1. PowerShell を起動

    • Windows キーを押して「PowerShell」と入力

    • 「Windows PowerShell」または「PowerShell」を選択

    • または、スタートメニューから「Windows PowerShell」を検索

  2. コマンドプロンプトを使う場合

    • Windows キーを押して「cmd」と入力

    • 「コマンドプロンプト」を選択

macOS の場合:

  1. Spotlight 検索を使う方法(推奨)

    • Cmd + Space を押して Spotlight 検索を開く

    • 「ターミナル」と入力して Enter

  2. Finder から起動する方法

    • Finder を開く

    • 「アプリケーション」→「ユーティリティ」→「ターミナル」をダブルクリック

  3. Dock から起動する方法

    • Dock にターミナルが追加されている場合、アイコンをクリック

ターミナルが起動したら、プロジェクトを置くディレクトリを作ります。

# ホームディレクトリに移動
cd ~

# プロジェクト用のディレクトリを作成
mkdir projects
cd projects

# この本のプロジェクト用ディレクトリ
mkdir adventure-game
cd adventure-game

# 現在位置を確認
pwd

期待される出力(macOS/Linux の場合):

/Users/YourName/projects/adventure-game

期待される出力(Windows の場合):

C:\Users\YourName\projects\adventure-game

注釈

YourNameについて

上記の出力例ではYourNameと表示していますが、これはあなたのユーザー名に置き換わります。

例えば:

  • macOS でユーザー名がtaroの場合: /Users/taro/projects/adventure-game

  • Windows でユーザー名がyamadaの場合: C:\Users\yamada\projects\adventure-game

実際の出力は、あなたの PC に設定されているユーザー名が表示されます。

3.4.2. プロジェクトの初期化

uvを使ってプロジェクトを初期化します。これにより、pyproject.tomlが作成され、依存関係を管理しやすくなります。

仮想環境は、プロジェクトごとに独立した Python 環境を作る仕組みです。

なぜ仮想環境が必要?

プロジェクト A: Django 4.2 が必要
プロジェクト B: Django 5.0 が必要

仮想環境なし → どちらか一方しかインストールできない(競合)
仮想環境あり → それぞれ別々の環境で共存できる

3.4.2.1. プロジェクトの初期化

第 2 章で学んだuvを使ってプロジェクトを初期化します。

# uv でプロジェクトを初期化
uv init --python 3.13

※ --python オプションを使って実行される python の最低バージョンを指定します。

注釈

uv initの使い分け

  • uv init プロジェクト名:新しいディレクトリを作成してプロジェクトを初期化

  • uv init:現在のディレクトリでプロジェクトを初期化

今回は既にadventure-gameディレクトリにいるので、引数なしのuv initを使います。

期待される出力:

Initialized project `adventure-game`

作成されたファイル構造(uv init実行後):

adventure-game/
├── .git/               # Git リポジトリ(自動初期化)
├── .gitignore          # Git の除外設定
├── .python-version     # Python バージョン指定ファイル
├── main.py             # サンプルコード(削除予定)
├── pyproject.toml      # プロジェクト設定ファイル
└── README.md           # プロジェクト説明ファイル(空ファイル)

注釈

ファイル構造の確認方法

ターミナルで以下のコマンドを実行すると、ファイル構造を確認できます:

# macOS/Linux の場合
ls -la

# Windows の場合(PowerShell)
dir

ls -laコマンドの説明:

  • ls: ファイルとディレクトリの一覧を表示

  • -l: 詳細情報(ファイルサイズ、更新日時など)を表示

  • -a: 隠しファイル(.で始まるファイル)も表示

出力例(macOS/Linux):

total 16
drwxr-xr-x  7 user  staff   224 Dec 15 10:00 .
drwxr-xr-x  5 user  staff   160 Dec 15 09:55 ..
drwxr-xr-x  8 user  staff   256 Dec 15 10:00 .git
-rw-r--r--  1 user  staff    45 Dec 15 10:00 .gitignore
-rw-r--r--  1 user  staff     8 Dec 15 10:00 .python-version
-rw-r--r--  1 user  staff   123 Dec 15 10:00 pyproject.toml
-rw-r--r--  1 user  staff    12 Dec 15 10:00 README.md

「.」「…」 は特別なファイル/ディレクトリです。 「.」 は現在のディレクトリそのものを表し、「…」 は親ディレクトリを表します。

出力例(Windows PowerShell):

    Directory: C:\Users\YourName\projects\adventure-game

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        12/15/2025  10:00 AM                .git
-a----        12/15/2025  10:00 AM              45 .gitignore
-a----        12/15/2025  10:00 AM               8 .python-version
-a----        12/15/2025  10:00 AM             123 pyproject.toml
-a----        12/15/2025  10:00 AM              12 README.md

main.py を削除:

uv initで作成されるmain.pyは、Django プロジェクトでは不要なので削除します。

# main.py を削除
rm main.py
# Windows の場合は: del main.py

削除後のファイル構造:

adventure-game/
├── .git/               # Git リポジトリ(自動初期化)
├── .gitignore          # Git の除外設定
├── .python-version     # Python バージョン指定ファイル
├── pyproject.toml      # プロジェクト設定ファイル
└── README.md           # プロジェクト説明ファイル(空ファイル)

注釈

.gitディレクトリについて

uv initを実行すると、Git リポジトリが自動的に初期化されます。.gitディレクトリには Git の設定情報が保存されますが、通常は直接編集しません。

仮想環境(.venv)は、uv addなどのコマンドを実行したときに自動的に作成されます。

3.4.2.2. pyproject.toml について

uv initを実行すると、プロジェクトディレクトリにpyproject.tomlというファイルが作成されます。このファイルには、プロジェクトの設定と依存関係が記録されます。

pyproject.tomlの役割:

  • プロジェクトのメタデータ(名前、バージョン、説明など)を定義

  • 依存関係(djangoなど)を記録

  • プロジェクトの設定を管理

uv add djangoなどのコマンドを実行すると、pyproject.tomlが自動的に更新され、依存関係が追加されます。

注釈

README.md について

uv initで作成されるREADME.mdは空ファイルです。後で LLM にプロジェクトの説明を書いてもらうことができます。

例えば、以下のように LLM に依頼できます:

あなた: この Django プロジェクトの README.md を書いてください。
プロジェクト名は「廃墟研究所からの脱出」で、
Django + LLM で作るテキストアドベンチャーゲームです。

LLM: [README.md の内容を生成]

今は空のままで問題ありません。

3.4.3. Django のインストール

仮想環境内に Django をインストールします。

# uv を使って Django をインストール(推奨)
uv add django==5.2

# インストール確認
uv run django-admin --version

期待される出力(uv add django実行時):

Using CPython 3.13.x interpreter at: /path/to/python3.13
Creating virtual environment at: .venv
Resolved 5 packages in 332ms
Prepared 2 packages in 1.02s
Installed 3 packages in 158ms
 + asgiref==3.11.0
 + django==5.2.x
 + sqlparse==0.5.4

期待される出力(uv run django-admin --version実行時):

5.2.x

または、より確実な方法:

uv run python -m django --version

注釈

django-adminpython -m djangoの使い分け

python -m djangoの方がより確実な理由:django-adminは OS の PATH 設定に依存しますが、python -m djangoは現在使用中の Python 環境内の Django を確実に呼び出すためです。

uv add django実行後のファイル構造:

adventure-game/
├── .git/
├── .gitignore
├── .python-version
├── .venv/              # 仮想環境(uv add で自動作成)
├── pyproject.toml      # 依存関係が追加される
├── uv.lock             # 正確なバージョンが記録される(新規作成)
└── README.md

3.4.3.1. uv.lock について

uv add djangoを実行すると、uv.lockというファイルも自動的に作成されます。

uv.lockの役割:

  • インストールされたパッケージの正確なバージョンを記録

  • 依存関係の依存関係(間接的な依存関係)も含めて記録

  • 他の環境で全く同じバージョンのパッケージを再現可能にする

pyproject.tomluv.lockの違い:

  • pyproject.toml: 人間が読み書きする設定ファイル。依存関係の範囲(例: django>=5.2)を指定

  • uv.lock: 自動生成されるファイル。実際にインストールされた正確なバージョン(例: django==5.2.x)を記録

なぜ両方必要?

  • pyproject.toml: 開発者が「Django 5.2 以上が必要」と指定

  • uv.lock: 実際にインストールされた「Django 5.2.x」を記録

これにより、他の開発者や本番環境でも、全く同じバージョンのパッケージをインストールできます。

Tip

uv.lockは Git にコミットする

uv.lockは、プロジェクトの依存関係を正確に再現するために重要です。必ず Git にコミットしてください。

.gitignoreuv.lockが含まれていないことを確認しましょう。

注釈

uv runについて

uvでインストールしたパッケージのコマンドを実行する場合は、uv runを使います。

  • django-admin --versionuv run django-admin --version

  • python manage.py runserveruv run python manage.py runserver

uv runを使うと、自動的に仮想環境内のパッケージが使用されます。

3.4.4. Django プロジェクトの作成

いよいよプロジェクトを作成します。

# Django プロジェクトを作成
uv run django-admin startproject server .

警告

最後の . を忘れずに!

uv run django-admin startproject server .
#                                          ↑ここ(最後のドット)

.がないと、ディレクトリがネストして分かりにくくなります:

# . なしの場合(分かりにくい)
adventure-game/
└── server/
    └── server/
        └── ...

# . ありの場合(推奨)
adventure-game/
└── server/
    └── ...

期待される出力:

(何も表示されない = 成功)

作成されたファイル構造:

adventure-game/
├── .venv/                      # 仮想環境
├── server/                     # プロジェクト設定ディレクトリ
│   ├── __init__.py             # Python パッケージマーク
│   ├── settings.py             # 設定ファイル(重要)
│   ├── urls.py                 # URL ルーティング
│   ├── asgi.py                 # 非同期サーバー用(今は不要)
│   └── wsgi.py                 # 本番サーバー用(後で使う)
├── uv.lock                     # uv の依存関係管理用
├── pyproject.toml              # プロジェクト管理用
└── manage.py                   # 管理コマンド(重要)

注釈

サブディレクトリの確認方法:

ファイル構造の確認で説明したls -laは、現在のディレクトリのファイルとディレクトリのみを表示します。 サブディレクトリの中身を確認するには、cdコマンドでサブディレクトリに移動してからls -laを実行します。

# 例: server ディレクトリの中身を確認する場合
cd server
ls -la

# 元のディレクトリに戻る場合
cd ..

例: serverディレクトリの中身を確認

# server ディレクトリに移動
cd server

# server ディレクトリの中身を確認
ls -la

出力例:

total 24
drwxr-xr-x  5 user  staff   160 Dec 15 10:05 .
drwxr-xr-x  7 user  staff   224 Dec 15 10:00 ..
-rw-r--r--  1 user  staff     0 Dec 15 10:05 __init__.py
-rw-r--r--  1 user  staff  1234 Dec 15 10:05 settings.py
-rw-r--r--  1 user  staff   567 Dec 15 10:05 urls.py
-rw-r--r--  1 user  staff   234 Dec 15 10:05 asgi.py
-rw-r--r--  1 user  staff   345 Dec 15 10:05 wsgi.py

各ファイルの役割:

ファイル

役割

manage.py

Django コマンドを実行するスクリプト

settings.py

プロジェクトの設定(データベース、言語など)

urls.py

URL とビューの対応付け

wsgi.py

本番環境でのデプロイに使用

3.4.5. 開発サーバーの起動

Django には開発用のサーバーが組み込まれています。

uv run python manage.py runserver

期待される出力:

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

December 15, 2025 - 07:49:47
Django version 5.2.x, using settings 'server.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

WARNING: This is a development server. Do not use it in a production setting. Use a production WSGI or ASGI server instead.
For more information on production servers see: https://docs.djangoproject.com/en/5.2/howto/deployment/

注釈

出力例について

※ 上記の出力例の「18 unapplied migration(s)」の数字(この例では 18)は、Django のバージョンによって異なりますが、問題ありません。

警告メッセージについて

2 つの警告メッセージが表示されます:

  1. 「unapplied migration(s)」というメッセージ: データベースのマイグレーションが未適用です。

この警告は「エラー」ではなく「お知らせ」です。 Django の標準機能(ユーザー管理など)を使うためのテーブルがまだ作成されていないという意味です。 3.5.3 章で解決するので、今は進めて大丈夫です。

  1. 「WARNING: This is a development server…」: 開発用サーバーであることを示す警告です。

開発中は問題ありませんが、本番環境では使用しないでください。デプロイのデプロイ時に本番用サーバーを使用します。

注釈

マイグレーション警告について

「unapplied migration(s)」という警告は、Django の標準機能(ユーザー管理、セッション管理など)を使うために必要なデータベーステーブルがまだ作成されていないことを意味します。

これは正常な状態で、次のコマンドで解決します。エラーではありません。

3.4.6. ブラウザで確認

  1. ブラウザを開く

  2. 以下の URL にアクセス

    http://127.0.0.1:8000/
    

    または

    http://localhost:8000/
    
  3. Django のウェルカムページが表示される!

Web フレームワークとは?

成功です!Django が動いています!

Tip

サーバーの停止

ターミナルで Ctrl + C を押すとサーバーが停止します。

再起動する時は、再度 uv run python manage.py runserver を実行。

コマンド履歴の活用

Cursor のターミナルでは、上矢印キー(↑)を押すと履歴からコマンドを呼び出せます。長いコマンドを何度も入力する手間が省けます。


3.5. Django の構造理解

3.5.1. manage.py とは

manage.pyは、Django の様々なコマンドを実行するためのスクリプトです。

よく使うコマンド:

# 開発サーバーを起動
uv run python manage.py runserver

# データベースのマイグレーション実行
uv run python manage.py migrate

# 管理者ユーザーを作成
uv run python manage.py createsuperuser

# アプリケーションを作成
uv run python manage.py startapp app_name

# Python シェルを起動(Django の機能が使える)
uv run python manage.py shell

3.5.2. settings.py の重要な設定

settings.pyは、Django プロジェクト全体の設定を管理するファイルです。データベース接続、インストール済みアプリケーション、言語設定、タイムゾーンなど、プロジェクトの動作に必要なすべての設定がここに記述されます。

server/settings.pyを Cursor で開いてみましょう。

Cursor でファイルを開く方法:

重要

プロジェクトを開く必要があります

Cursor でサイドバーからファイルを開くには、まずプロジェクト(作業ディレクトリ)を開いている必要があります。

プロジェクトを開く方法:

  1. File メニューから開く

    • FileOpen Folder...(macOS: FileOpen Folder...

    • adventure-gameディレクトリを選択

  2. ドラッグ&ドロップで開く

    • Finder(macOS)またはエクスプローラー(Windows)でadventure-gameフォルダを開く

    • フォルダを Cursor のウィンドウにドラッグ&ドロップ

  3. ターミナルから開く

    cd ~/projects/adventure-game
    cursor .
    

プロジェクトを開いた後、以下の方法でファイルを開けます。

  1. サイドバーから開く

    • Cursor の左側のサイドバー(エクスプローラー)で、serverフォルダを展開

    • settings.pyをクリックして開く

  2. Cmd/Ctrl + P で検索して開く

    • Cmd+P(macOS)または Ctrl+P(Windows)を押す

    • settings.py」と入力して Enter キーを押す

  3. ファイルパスから直接開く

    • Cmd+O(macOS)または Ctrl+O(Windows)を押す

    • ファイル選択ダイアログで server/settings.py を選択

  4. ターミナルから開く(Cursor のターミナル機能を使用)

    • Cursor の統合ターミナルで以下を実行:

    cursor server/settings.py
    

    または

    code server/settings.py
    

Tip

Cursor でのファイル検索のコツ

Cmd/Ctrl + Pでファイルを検索する際は、ファイル名の一部を入力するだけで、候補が表示されます。

例:

  • 「settings」→ settings.pyが候補に表示される

  • 「urls」→ urls.pyが候補に表示される

また、フォルダ名も含めて検索できます:

  • 「server settings」→ server/settings.pyが候補に表示される

3.5.2.1. SECRET_KEY

SECRET_KEY = 'django-insecure-...'

SECRET_KEYは、Django のセキュリティ機能で使用される重要な値です。セッション、CSRF 保護、署名付きデータの検証などに使用されます。

警告

SECRET_KEY の重要性

SECRET_KEY は、Django のセキュリティ機能で使用される重要な値です。

  • [√] 開発中: 生成されたものをそのまま使って OK

  • [×] 本番環境: 必ず変更し、環境変数で管理(10 章EC2 インスタンスのセットアップで解説)

  • [×] 公開リポジトリ: 機密情報のため、本来はコミットすべきではない

注釈

学習段階での扱い

学習段階では、練習用なのでコミットしてしまいますが、実際のアプリを公開する際は10 章で学ぶ環境変数の方法を使います。

実際の開発では、SECRET_KEY を.env ファイルで管理し、.gitignore に追加する習慣をつけましょう。 2 章で学んだ環境変数の基礎を活用します。

# .env ファイルの作成
SECRET_KEY=django-insecure-your-key-here

# .gitignore に追加
.env

詳細は10 章EC2 インスタンスのセットアップで扱います。 今は settings.py の値をそのまま使っていて構いません。

3.5.2.2. DEBUG 設定

# 開発中は True、本番環境では False
DEBUG = True
  • True: 詳細なエラーメッセージが表示される(開発用)

  • False: ユーザーには簡単なエラーページ(本番用)

危険

本番環境では必ず DEBUG=False

DEBUG=Trueのまま本番環境にデプロイすると、 機密情報が漏洩する危険があります。

10 章のデプロイ時に必ず変更します。

3.5.2.3. ALLOWED_HOSTS

ALLOWED_HOSTS = []

ALLOWED_HOSTS とは?

ALLOWED_HOSTSは、どのホスト(ドメイン)からのリクエストを受け付けるかを制御する設定です。 セキュリティのため、Django はリクエストのHostヘッダーをチェックし、ALLOWED_HOSTSに含まれていないホストからのリクエストは拒否します。

なぜ必要か?

悪意のあるユーザーが、偽のHostヘッダーを送信して、Django アプリケーションを騙そうとする攻撃(Host Header Attack)を防ぐためです。

開発中(DEBUG=True)の間は、このままでも localhost からアクセスできます。Django は開発環境ではALLOWED_HOSTSのチェックを緩和します。

本番環境(DEBUG=False)では、ここに許可するドメイン名を必ず設定する必要があります。設定しないと、すべてのリクエストが拒否され、アプリケーションにアクセスできなくなります。

# 本番時(例)
ALLOWED_HOSTS = ['example.com', 'www.example.com']

設定例:

# 特定のドメインのみ許可
ALLOWED_HOSTS = ['example.com', 'www.example.com']

# すべてのサブドメインを許可(ワイルドカード使用)
ALLOWED_HOSTS = ['.example.com']  # example.com と *.example.com を許可

# 開発環境と本番環境で分ける場合(推奨)
if DEBUG:
    ALLOWED_HOSTS = []  # 開発環境では空で OK
else:
    ALLOWED_HOSTS = ['example.com', 'www.example.com']  # 本番環境では必須

3.5.2.4. INSTALLED_APPS

Django での「アプリ」とは?

Django では、プロジェクト全体を小さな機能単位の「アプリケーション(アプリ)」に分割して開発します。 例えば、ブログサイトなら「記事管理アプリ」「コメントアプリ」「ユーザー管理アプリ」のように分けます。

  • プロジェクト: サイト全体の設定を管理(settings.pyなど)

  • アプリ: 特定の機能を実装する単位(モデル、ビュー、テンプレートを含む)

INSTALLED_APPS とは?

INSTALLED_APPSは、Django プロジェクトで使用するアプリケーションのリストです。ここに登録されたアプリのみが、Django の機能(データベースマイグレーション、管理画面への表示など)を利用できます。

INSTALLED_APPS = [
    'django.contrib.admin',          # 管理画面
    'django.contrib.auth',           # 認証
    'django.contrib.contenttypes',   # コンテンツタイプ
    'django.contrib.sessions',       # セッション管理
    'django.contrib.messages',       # メッセージフレームワーク
    'django.contrib.staticfiles',    # 静的ファイル管理
]

django.contrib.*は、Django が提供する標準アプリケーションです。自分で作ったアプリケーションも、ここに追加します(後で実践)。

3.5.2.5. DATABASES

DATABASES とは?

DATABASESは、Django プロジェクトで使用するデータベースの接続情報を設定する項目です。 Django は複数のデータベースを同時に使用できますが、通常はdefaultという名前のデータベースを 1 つ使用します。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
  • ENGINE: 使用するデータベースエンジンを指定(SQLite、PostgreSQL、MySQL など)

  • NAME: データベースファイルのパス(SQLite の場合)またはデータベース名

デフォルトで SQLite が設定されています。 SQLite はファイルベースのデータベースで、設定が簡単で開発に適しています。 本書ではこのまま使います。

3.5.2.6. LANGUAGE_CODE

LANGUAGE_CODE とは?

LANGUAGE_CODEは、Django アプリケーションのデフォルト言語を設定する項目です。 管理画面やエラーメッセージなど、Django が自動生成するテキストの言語が決まります。

# デフォルトは英語
LANGUAGE_CODE = 'en-us'

# 日本語に変更する場合
LANGUAGE_CODE = 'ja'

言語コードは ISO 639-1 形式(2文字)または ISO 639-1 と ISO 3166-1 の組み合わせ(例: jaen-us)で指定します。

注釈

ISO 規格について

ISO(International Organization for Standardization、国際標準化機構)は、国際的な規格を定める組織です。

  • ISO 639-1: 言語を表す 2 文字コード(例: ja=日本語、en=英語、fr=フランス語)

  • ISO 3166-1: 国や地域を表す 2 文字コード(例: JP=日本、US=アメリカ、GB=イギリス)

組み合わせの例:

  • ja: 日本語(ISO 639-1 のみ)

  • en-us: 英語(アメリカ)(ISO 639-1 + ISO 3166-1)

  • en-gb: 英語(イギリス)(ISO 639-1 + ISO 3166-1)

Django では、主に ISO 639-1 の言語コードを使用します。 地域の違いを区別したい場合(例: アメリカ英語とイギリス英語)は、ISO 3166-1 も組み合わせます。

3.5.2.7. TIME_ZONE

タイムゾーンとは?

タイムゾーンとは、地球上の地域ごとに設定されている標準時刻のことです。 地球は丸いため、地域によって太陽の位置が異なり、時刻も変わります。

例えば:

  • 日本(Asia/Tokyo): 日本標準時(JST)、UTC+9 時間

  • アメリカ東海岸(America/New_York): 東部標準時(EST)、UTC-5 時間(夏時間は UTC-4 時間)

  • イギリス(Europe/London): グリニッジ標準時(GMT)、UTC+0 時間(夏時間は UTC+1 時間)

同じ瞬間でも、地域によって表示される時刻が異なります。 例えば、日本が午後 3 時の時、イギリスは午前 6 時です。

TIME_ZONE とは?

TIME_ZONEは、Django アプリケーションで使用するタイムゾーンを設定する項目です。 日時データの保存や表示に影響します。

# デフォルトは UTC
TIME_ZONE = 'UTC'

# 日本時間に変更する場合
TIME_ZONE = 'Asia/Tokyo'

注釈

UTC とは?

UTC(協定世界時)は、世界共通の基準時刻です。 データベースには常に UTC で保存され、表示時に設定されたタイムゾーンに変換されます。

タイムゾーンは IANA タイムゾーンデータベースの形式(例: Asia/TokyoAmerica/New_York)で指定します。

Tip

設定を日本語化

settings.pyを開いて、以下を変更してみましょう:

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

保存後、サーバーを再起動すると、ウエルカム画面や管理画面が日本語になります。

3.5.3. マイグレーションの実行

先ほどの警告メッセージを解決しましょう。

データベースとは?

まずデータベースについて説明します。 データベースは、データを整理して保存するための仕組みです。 Excel のスプレッドシートをイメージすると分かりやすいでしょう。

  • Excel のシート = データベースのテーブル(表)

  • Excel の行 = データベースのレコード(1件のデータ)

  • Excel の列 = データベースのカラム(項目名)

例えば、ユーザー情報を保存するテーブルなら:

ID

名前

メールアドレス

1

太郎

taro@example.com

2

花子

hanako@example.com

このような表形式でデータを保存・管理できます。 データベースを使うことで、大量のデータを効率的に保存し、検索や更新が簡単にできます。

マイグレーションとは?

マイグレーションは、データベースの構造(テーブル)を作成・変更する仕組みです。 Excel で新しいシートを作成したり、列を追加したりする作業を、Django が自動的に管理してくれます。

# サーバーを停止(Ctrl + C)

# マイグレーションを実行
uv run python manage.py migrate

期待される出力:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  ...
  Applying sessions.0001_initial... OK

何が起きた?

  • db.sqlite3というファイルが作成された

  • その中に、認証やセッション管理に必要なテーブルが作られた

# ファイルを確認
ls -la

出力(db.sqlite3 が追加されている):

...
-rw-r--r--  1 user  staff  143360 Jan 30 10:05 db.sqlite3
...

これで Django でシステムを作る基礎は作成できました。


3.6. Hello World 表示

それでは、次に Django のウェルカムページではなく、自分のページを表示させましょう。

ここでは、テンプレートを使った Hello World を表示する方法を学びます。 この方法では、HTML テンプレートを使って見た目の整ったページを表示します。

テンプレートとは?

テンプレートは、HTML ファイルに動的なデータ(変数)を埋め込むための仕組みです。 例えば、「現在の時刻を表示する」という場合、時刻は常に変わるので、テンプレート内に{{ current_time }}という変数を書いておき、Python 側で時刻を計算して渡します。

テンプレートを使うことで:

  • HTML の見た目と、Python の処理を分離できる

  • 同じテンプレートを複数のページで使い回せる

  • デザインの変更が簡単になる

ここでは、「プロジェクト作成(LLM と一緒に)」で作成したserverプロジェクトに対して、Hello World を表示するビューを作成します。

重要

【重要】作業ディレクトリの確認

ここから先のコマンドは、すべてadventure-gameディレクトリで実行してください。

# 現在位置を確認
pwd
# 期待される出力:/Users/YourName/projects/adventure-game

違っていれば以下で移動:

cd ~/projects/adventure-game

3.6.1. ステップ 1: アプリケーションの作成

まず、gameという名前のアプリケーションを作成します。 既に「ゲーム用プロジェクトの準備」で作成済みの場合は、このステップをスキップしてください。

# game アプリを作成
uv run python manage.py startapp game

注釈

重複実行について

既に作成済みの場合は、このステップをスキップしてください。 誤って 2 回目を実行してエラーが出ても、gameアプリは既に作成済みなので問題ありません。

エラー例:

CommandError: 'game' conflicts with the name of an existing Python module

→ このエラーが出た場合は、既にgameアプリが存在するので次に進んでください。

作成されるディレクトリ構造:

adventure-game/
├── server/                # プロジェクト設定
├── game/                  # 新しく作成されたアプリ(または既存)
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   ├── views.py
│   └── migrations/
└── manage.py

3.6.2. ステップ 2: アプリを登録

作成したアプリケーションを Django プロジェクトで使えるようにするには、settings.pyINSTALLED_APPSに登録する必要があります。 既に「ゲーム用プロジェクトの準備」で登録済みの場合は、このステップをスキップしてください。

server/settings.pyを開いて、INSTALLED_APPS'game'を追加します:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'game',  # 追加(既に追加済みの場合は変更不要)
]

3.6.3. ステップ 3: テンプレートディレクトリの作成

Django でテンプレートを使うには、まずテンプレートファイルを置くディレクトリを作成する必要があります。

gameアプリ内にtemplatesディレクトリを作成します:

macOS/Linux の場合:

# game アプリ内に templates ディレクトリを作成
mkdir -p game/templates/game

Windows(PowerShell)の場合:

# game アプリ内に templates ディレクトリを作成
mkdir game\templates\game

ディレクトリ構造:

game/
├── templates/
│   └── game/           # アプリ名のディレクトリ(重要)
│       └── home.html   # テンプレートファイル
├── views.py
└── ...

注釈

なぜgame/templates/game/とネストするのか?

templatesの下に、さらにgameというディレクトリを作る理由は、複数のアプリで同じファイル名(例: home.html)がある場合に、Django が混乱しないようにするためです。

テンプレートを読み込む際は、'game/home.html'のように、アプリ名から始まるパスを指定します。

3.6.4. ステップ 4: HTML テンプレートの作成

game/templates/game/home.htmlというファイルを新規作成し、以下の内容を書きます:

※ ファイルの作成には、cursor を使うと便利です。gameフォルダーを展開、templatesフォルダーを展開、gameフォルダーを展開して、そこに新規ファイルでhome.htmlを作り、以下の内容を入力します。以降は同様に幾つもファイルを作成しますので、覚えておいてください。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>冒険ゲーム</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 50px auto;
            padding: 20px;
            background-color: #f5f5f5;
        }
        .container {
            background-color: white;
            padding: 30px;
            border-radius: 8px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        h1 {
            color: #333;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>廃墟研究所からの脱出</h1>
        <p>Django + LLM で作るテキストアドベンチャー</p>
        <p>現在の時刻: {{ current_time }}</p>
    </div>
</body>
</html>

テンプレートのポイント:

  • {{ current_time }}: これはテンプレート変数です。

    • 二重波括弧 {{ }} は「ここに変数の値を表示してください」という Django 専用の記号

    • Python 側から渡されたcurrent_timeという変数の値が、ここに表示されます

    • Django が自動的に変数の値に置き換えます

  • HTML の他の部分(<h1>タグや<p>タグなど)は、そのまま表示されます。

3.6.5. ステップ 5: ビューを作成

game/views.pyを開いて、以下のように編集します:

from django.shortcuts import render
from datetime import datetime

def home(request):
    context = {
        'current_time': datetime.now().strftime('%Y 年%m 月%d 日 %H:%M:%S')
    }
    return render(request, 'game/home.html', context)

コードの説明:

  1. from django.shortcuts import render

    • テンプレートをレンダリング(HTML に変換)するための関数をインポートします。

  2. from datetime import datetime

    • 現在の日時を取得するための機能をインポートします。

  3. context = { 'current_time': ... }

    • contextは、テンプレートに渡すデータを格納する辞書(キーと値のペア)です。

    • 'current_time'というキーで、現在の時刻を文字列として格納しています。

    • datetime.now().strftime('%Y 年%m 月%d %H:%M:%S')は、現在の日時を「2025 年 12 月 16 日 18:30:45」のような形式の文字列に変換します。

  4. return render(request, 'game/home.html', context)

    • render関数は、テンプレートファイルを読み込み、contextのデータを埋め込んで、HTML を生成した HttpResponse オブジェクトを返します

    • request: ユーザーからのリクエスト情報(この関数内ではrender関数に渡すために使用しています)

    • 'game/home.html': 使用するテンプレートファイルのパス(templatesディレクトリからの相対パス)

    • context: テンプレートに渡すデータ

    • renderは内部でHttpResponseを作成するので、私たちが明示的にHttpResponseを書く必要はありません。

3.6.6. ステップ 6: URL を設定

  1. game/urls.py を作成 (新規ファイル)

gameディレクトリ内にurls.pyという新規ファイルを作成します。

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
]
  1. プロジェクトの urls.py で読み込む

server/urls.pyを開いて、以下のように編集します:

from django.contrib import admin
from django.urls import path, include  # include を追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('game.urls')),  # game アプリの URL を読み込む
]

3.6.7. ステップ 7: 確認

ここまでの設定が完了したら、開発サーバーを起動して、ブラウザでアクセスして動作を確認しましょう。

uv run python manage.py runserver

注釈

マイグレーション警告について

サーバー起動時に「unapplied migration(s)」という警告が表示される場合がありますが、Hello World を表示するだけなら無視して問題ありません。マイグレーションは、データベースを使う機能(管理画面など)で必要になります。

ブラウザで http://localhost:8000/ にアクセスします。

表示されるページ:

../_images/django-home%402x.png

図 3.1 ウエルカム画面

  • タイトル: 「廃墟研究所からの脱出」

  • サブタイトル: 「Django + LLM で作るテキストアドベンチャー」

  • 現在の時刻: アクセスした時点の日時が表示されます(例: 2025 年 12 月 16 日 18:30:45)

ページをリロード(更新)すると、時刻が更新されることが確認できます。これが、テンプレートを使った動的なページの特徴です。

成功!テンプレートを使ったページが表示できました!

これで、HTML テンプレートを使って、見た目の整った Web ページを表示できるようになりました。


3.7. つまずきポイント

3.7.1. つまずきポイント 1: python vs python3

3.7.1.1. 症状

python manage.py runserver

エラー:

python: command not found

3.7.1.2. 原因

macOS/Linux では、pythonコマンドが存在しない場合がある。本書ではuvを使用しているため、uv run pythonを使う必要がある。

3.7.1.3. 解決方法

本書ではuvを使用しているため、uv run pythonコマンドを使います。

# uv run python を使う(推奨)
uv run python manage.py runserver

これにより、プロジェクトの仮想環境内の Python が自動的に使用されます。

3.7.1.4. LLM に質問する例

あなた: macOS で「python manage.py runserver」を実行すると
「command not found」と表示されます。
uv を使っているプロジェクトです。どうすればいいですか?

LLM: uv を使っているプロジェクトでは、`uv run python`コマンドを使います...
[解決策の提示]

3.7.2. つまずきポイント 2: django-adminが見つからない

3.7.2.1. 症状

django-admin startproject server .

エラー:

django-admin: command not found

3.7.2.2. 原因

本書ではuvを使用しているため、uv run django-adminを使う必要がある。または、Django がインストールされていない可能性がある。

3.7.2.3. 解決方法

本書ではuvを使用しているため、uv run django-adminコマンドを使います。

# uv run django-admin を使う(推奨)
uv run django-admin startproject server .

Django がインストールされていない場合:

# Django をインストール
uv add django

# その後、uv run django-admin が使えるようになる
uv run django-admin startproject server .

3.7.3. つまずきポイント 3: ポートが既に使用中

3.7.3.1. 症状

uv run python manage.py runserver

エラー:

Error: That port is already in use.

3.7.3.2. 解決方法

ポート番号とは?

ポート番号は、コンピュータ上のプログラム(アプリケーション)への通信の出入り口を表す番号です。例えるなら、マンションの部屋番号のようなものです。

  • マンションの住所 = コンピュータの IP アドレス(例: localhost

  • 部屋番号 = ポート番号(例: 8000

ブラウザがhttp://localhost:8000/にアクセスするとき、localhostという住所(IP アドレス)の8000番という出入り口(ポート番号)を通って、そのポートで待機しているプログラム(この場合は Django の開発サーバー)に接続します。

Django の開発サーバーは、デフォルトでポート番号8000を使用します。http://localhost:8000/:8000の部分がポート番号です。同じポート番号を 2 つのプログラムが同時に使うことはできません。そのため、既に別のプログラムがポート 8000 を使っていると、このエラーが発生します。

注釈

ポート番号について

  • 開発環境: Django の開発サーバーはデフォルトでポート 8000 を使用

  • 本番環境: 通常 80(HTTP)や 443(HTTPS)を使用

注釈

127.0.0.1 と localhost の違いは?

  • 127.0.0.1: IP アドレス形式(数字で表現)

  • localhost: 名前形式(人間が読みやすい)

どちらも「自分の PC」を指します。:8000 はポート番号(部屋番号のようなもの)です。

もし「アクセスできない」場合:

  • ファイアウォールの設定を確認

  • サーバーが起動しているか確認(ターミナルを確認)

  • 別のアプリが 8000 番ポートを使用していないか確認

プロセスとプロセス ID(PID)とは?

プロセスとは、コンピュータ上で実行されているプログラムのことです。例えば、Django の開発サーバーも 1 つのプロセスです。

プロセス ID(PID)は、各プロセスに割り当てられる一意の番号です。プロセスを終了する際に、この番号を使って特定のプロセスを指定します。

この問題の対処方法として 3 種類の方法を示します。

解決策(安全な順):

  1. 最推奨:別のポートを使う - 最も安全で簡単

  2. 推奨:PC を再起動 - 確実で安全

  3. 上級者向け:プロセス終了 - リスクがあるため注意が必要

方法 1: 別のポートを使う(最推奨)

uv run python manage.py runserver 8001

ブラウザで http://localhost:8001/ にアクセス。

重要: この方法を使った場合、これ以降の URL(管理画面アクセスなど)は 8000 ではなく 8001 に読み替えてください。

方法 2: PC を再起動する(推奨・確実)

PC を再起動すると、すべてのプロセスが終了し、ポート 8000 が確実に解放されます。最も安全で確実な方法です。

方法 3: 使用中のプロセスを終了(上級者向け・注意が必要)

警告

重要な注意

この方法は、誤って重要なプロセスを終了してしまうリスクがあります。必ず、終了するプロセスが Django の開発サーバーであることを確認してから実行してください。

少し難しい方法ですが、ポート 8000 を使用しているプロセス(プログラム)を終了する方法もあります。これにより、ポート 8000 が空き、再度使用できるようになります。macOS/Linux と Windows で手順が異なります。

macOS/Linux の場合:

  1. ポート 8000 を使用しているプロセスを確認:

lsof -i :8000

または

netstat -anv | grep 8000
  1. プロセス ID(PID)を確認し、プロセスを終了:

出力例:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  12345  user   3u  IPv4  ...      0t0  TCP *:8000 (LISTEN)

この例では、PID が12345です。この番号を使ってプロセスを終了します:

# PID が 12345 の場合の例
kill 12345

# 強制終了する場合
kill -9 12345

Windows の場合:

  1. ポート 8000 を使用しているプロセスを確認:

netstat -ano | findstr :8000
  1. プロセス ID(PID)を確認し、タスクマネージャーで終了するか、コマンドで終了:

出力例:

TCP    0.0.0.0:8000    0.0.0.0:0    LISTENING    12345

この例では、PID が12345です。この番号を使ってプロセスを終了します:

REM PID が 12345 の場合の例
taskkill /PID 12345 /F

または、タスクマネージャーを開き(Ctrl + Shift + Esc)、「詳細」タブで PID 列を表示し、該当するプロセスを右クリックして「タスクの終了」を選択します。

注意: 他の Django 開発サーバーが動いている可能性があります。終了する前に、他のターミナルウィンドウでサーバーが動いていないか確認してください。


3.7.4. つまずきポイント 4: ModuleNotFoundError

3.7.4.1. 症状

ModuleNotFoundError: No module named 'game'

3.7.4.2. 原因

  1. INSTALLED_APPSに追加していない

  2. タイポ(スペルミス)

    タイポ(typo)とは?

    タイポ(typo)とは、文字の入力ミス(スペルミス)のことです。typographical error(タイポグラフィカルエラー)の略で、プログラミングでは非常によく遭遇するミスです。

    例えば、'game'と書くべきところを'gam''Game'(大文字小文字の違い)と書いてしまうと、Django はアプリを見つけられません。Python は大文字と小文字を区別するため、'game''Game'は別物として扱われることに注意してください。

3.7.4.3. 解決方法

settings.pyINSTALLED_APPSを確認:

INSTALLED_APPS = [
    ...
    'game',  # これが追加されているか確認
]

3.7.5. つまずきポイント 5: ImproperlyConfigured

3.7.5.1. 症状

django.core.exceptions.ImproperlyConfigured: 
The SECRET_KEY setting must not be empty.

3.7.5.2. 原因

settings.pySECRET_KEYが空、または削除されている。

3.7.5.3. 解決方法

settings.pyを開いて、SECRET_KEYを確認:

SECRET_KEY = 'django-insecure-...'  # 何か文字列が入っているはず

もし削除してしまった場合:

# 新しい SECRET_KEY を生成(LLM に頼む)
あなた: Django の SECRET_KEY を誤って削除してしまいました。
新しい SECRET_KEY を生成する方法を教えてください。

LLM: Python で以下のコードを実行すると、
ランダムな SECRET_KEY が生成されます:

from django.core.management.utils import get_random_secret_key
print(get_random_secret_key())

3.7.6. つまずきポイント 6: ページが表示されない(404 エラー)

3.7.6.1. 症状

ブラウザで http://localhost:8000/game/ にアクセスすると:

Page not found (404)

3.7.6.2. 原因

URL パターンが一致していない。

3.7.6.3. 解決方法

デバッグページを確認

DEBUG=Trueの場合、Django は詳細なエラーページを表示します。

Using the URLconf defined in server.urls, 
Django tried these URL patterns, in this order:

1. admin/
2. [name='home']

The current path, game/, didn't match any of these.

このメッセージから、/game/という URL パターンが定義されていないことが分かります。

修正:

game/urls.py:

urlpatterns = [
    path('', views.home, name='home'),       # /
    path('game/', views.home, name='game'),  # /game/ でも同じビューを使う例
]

注意: 「ゲーム用プロジェクトの整理」を行い、トップページ(http://localhost:8000/)にアクセスすると 404 エラー(ページが見つかりません)が表示されますが、これは正常です。 以降の章でゲーム用の URL とビューを実装すると、再びページが表示されるようになります。


3.8. 管理画面を見てみる

Django の強力な機能の一つが、自動生成される管理画面(Admin Panel)です。

管理画面とは?

管理画面は、データベースの内容を視覚的に確認・編集できる Web インターフェースです。通常、データベースの内容を確認・編集するには、SQL というデータベース専用の言語を書く必要がありますが、管理画面を使えば、ブラウザ上でマウス操作だけでデータを管理できます。

管理画面でできること:

  • データの追加・編集・削除(CRUD 操作)

  • データの検索・フィルタリング

  • ユーザー管理

  • データの一覧表示

注釈

CRUD 操作とは?

CRUD 操作とは、Create(作成)、Read(取得)、Update(更新)、Delete(削除)の 4 つの基本的なデータベース操作のことです。管理画面では、これらの操作をマウス操作だけで行えます。

例えば、ブログサイトなら「記事を追加する」「記事を編集する」「記事を削除する」といった操作を、コードを書かずに管理画面から行えます。開発中にデータを確認したり、テストデータを追加したりする際に非常に便利です。

3.8.1. ゲーム用プロジェクトの管理画面設定

前のセクション「Hello World 表示」で作成したadventure-gameプロジェクトの管理画面を設定しましょう。

作業ディレクトリの確認:

# ゲーム用プロジェクトのディレクトリに移動
cd ~/projects/adventure-game

# 現在位置を確認
pwd

3.8.2. スーパーユーザーの作成

管理画面にアクセスするには、まず管理者アカウント(スーパーユーザー)を作成する必要があります。スーパーユーザーは、管理画面にログインして、すべてのデータを管理できる権限を持ったユーザーです。

通常のユーザーアカウントとは異なり、スーパーユーザーは特別な権限を持ち、システム全体を管理できます。開発中は、自分がスーパーユーザーとしてログインして、データを管理します。

以下のコマンドでスーパーユーザーを作成します:

# スーパーユーザー(管理者)を作成
uv run python manage.py createsuperuser

対話形式で入力:

Username (leave blank to use 'yourname'): admin
Email address: admin@example.com
Password: ********
Password (again): ********
Superuser created successfully.

重要

パスワード入力時の注意

パスワードを入力する際、セキュリティのため画面には何も表示されませんが、入力は正常に受け付けられています。入力後に Enter キーを押してください。

注釈

パスワードの要件

  • 最低 8 文字

  • 一般的すぎるパスワード(password123など)は警告が出る

  • 開発環境では簡単なパスワードでも OK

3.8.3. 管理画面にアクセス

スーパーユーザーを作成したら、管理画面にアクセスしてみましょう。

uv run python manage.py runserver

ブラウザで http://localhost:8000/admin/ にアクセスします。

ログイン画面が表示される:

管理画面のログイン画面が表示されます。ここで、先ほど作成したスーパーユーザーのユーザー名とパスワードを入力してログインします。

../_images/django-admin-login%402x.png

図 3.2 ログイン画面

先ほど作成したadminユーザーでログインします。

管理画面のダッシュボードが表示される!

ログインに成功すると、管理画面のダッシュボード(ホーム画面)が表示されます。ダッシュボードには、管理できる項目の一覧が表示されます。

../_images/django-admin-list%402x.png

図 3.3 管理画面(一覧)

デフォルトで管理できる項目:

  • Users(ユーザー): サイトに登録されているユーザーアカウントを管理できます。ユーザーの追加・編集・削除、権限の設定などができます。

  • Groups(グループ): ユーザーをグループに分類して、グループ単位で権限を設定できます。例えば、「編集者グループ」「閲覧者グループ」などを作成できます。

管理画面の使い方:

各項目をクリックすると、そのデータの一覧が表示されます。例えば、「Users」をクリックすると、登録されているユーザーの一覧が表示され、各ユーザーをクリックして編集したり、新しいユーザーを追加したりできます。

また、検索ボックスやフィルター機能を使って、特定のデータを素早く見つけることもできます。

../_images/django-admin-user%402x.png

図 3.4 管理画面(ユーザー)

開発中の実用例:

管理画面は、次章以降で以下のような場面で活躍します:

  • ゲームのテストデータ(部屋、アイテムなど)を手動で追加

  • プレイヤーの進行状況を確認・修正

  • デバッグ時にデータベースの内容を確認

ゲーム用プロジェクトの管理画面が正しく動作することを確認:

現在、adventure-gameプロジェクトの管理画面にアクセスできることを確認しました。次の章では、このプロジェクトにゲーム用のモデルを追加し、管理画面でそれらのデータを管理できるようにします。

Tip

管理画面の言語を日本語に

server/settings.pyLANGUAGE_CODE = 'ja'に設定していれば、 管理画面も日本語で表示されます。


3.9. ゲーム用プロジェクトの整理

前の節で Django の基本を学ぶために作成したプロジェクトを、 本格的なゲーム開発用に整理しましょう。

3.9.1. 現在の状況確認

まず、現在のディレクトリ構造を確認します。

# 現在のディレクトリ構造を確認
ls -la
# Windows の場合は: dir

現在のディレクトリ構造:

adventure-game/
├── .venv/                      # 仮想環境
├── server/                     # プロジェクト設定ディレクトリ
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── asgi.py
│   └── wsgi.py
├── manage.py
├── pyproject.toml
└── uv.lock

この構造を表示する方法:

ls -laはファイルの詳細情報を表示しますが、ツリー構造のような見やすい形式ではありません。以下の方法で、上記のようなツリー構造を表示できます:

  1. treeコマンドを使う(推奨)

    # tree コマンドをインストール(macOS)
    brew install tree
    
    # tree コマンドをインストール(Windows)
    # Chocolatey を使う場合: choco install tree
    # または、公式サイトからダウンロード: https://gnuwin32.sourceforge.net/packages/tree.htm
    
    # ディレクトリ構造を表示
    tree
    

    出力例:

    .
    ├── server
    │   ├── __init__.py
    │   ├── __pycache__
    │   │   ├── __init__.cpython-311.pyc
    │   │   ├── settings.cpython-311.pyc
    │   │   ├── urls.cpython-311.pyc
    │   │   └── wsgi.cpython-311.pyc
    │   ├── asgi.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── db.sqlite3
    ├── game
    │   ├── __init__.py
    │   ├── __pycache__
    │   │   ├── __init__.cpython-311.pyc
    │   │   ├── admin.cpython-311.pyc
    │   │   ├── apps.cpython-311.pyc
    │   │   ├── models.cpython-311.pyc
    │   │   ├── urls.cpython-311.pyc
    │   │   └── views.cpython-311.pyc
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   │   ├── __init__.py
    │   │   └── __pycache__
    │   │       └── __init__.cpython-311.pyc
    │   ├── models.py
    │   ├── templates
    │   │   └── game
    │   │       └── home.html
    │   ├── tests.py
    │   ├── urls.py
    │   └── views.py
    ├── manage.py
    ├── pyproject.toml
    ├── README.md
    └── uv.lock
    
    8 directories, 30 files
    
  2. findコマンドを使う(macOS/Linux)

    find . -not -path '*/\.*' | sed 's|[^/]*/| |g'
    
  3. ls -laで確認する場合

    ls -laでは、現在のディレクトリのファイルとディレクトリの一覧が表示されます。サブディレクトリの中身を確認するには、cdコマンドで移動してからls -laを実行します。

    # 現在のディレクトリの内容を確認
    ls -la
    
    # server ディレクトリの中身を確認
    cd server
    ls -la
    

注釈

treeコマンドが使えない場合

treeコマンドがインストールされていない場合は、ls -laで確認するか、LLM に「ディレクトリ構造を表示する方法を教えてください」と質問してみてください。

Cursor を使っている場合は、Cursor のサイドバー(エクスプローラー)でディレクトリ構造を視覚的に確認することもできます。

3.9.2. Hello World コードのリセット

前の節で作成した Hello World のコードを、ゲーム開発用に整理します。

3.9.2.1. game/views.py を初期状態に戻す

game/views.pyを開いて、Hello World のコードを削除し、初期状態に戻します。

現在の内容(Hello World のコード):

from django.shortcuts import render
from datetime import datetime

def home(request):
    context = {
        'current_time': datetime.now().strftime('%Y 年%m 月%d 日 %H:%M:%S')
    }
    return render(request, 'game/home.html', context)

以下のように変更(初期状態に戻す):

from django.shortcuts import render

# Create your views here.

3.9.2.2. game/urls.py をゲーム用に変更

game/urls.pyを開いて、ゲーム開発用に整理します。

現在の内容(Hello World のコード):

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
]

以下のように変更(ゲーム用に整理):

from django.urls import path
from . import views

urlpatterns = [
    # ゲームの URL パターンをここに追加していきます
]

または、Hello World のビューを削除したので、game/urls.pyファイル自体を削除することもできます。 ただし、後でゲームの URL を追加する際に必要になるので、空のurlpatternsを残しておくことをおすすめします。

3.9.2.3. server/urls.py の確認

server/urls.pyを確認して、game.urlsへの参照がある場合は、一時的にコメントアウトするか、削除します。

現在の内容(Hello World のコード):

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('game.urls')),  # Hello World 用
]

以下のように変更(ゲーム用に整理):

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    # ゲームの URL は後で追加します
    # path('', include('game.urls')),
]

注釈

テンプレートファイルについて

game/templates/game/home.htmlは、後でゲームのテンプレートとして再利用できるので、そのまま残しておいても問題ありません。必要に応じて削除することもできます。

3.10. Git へのコミット

ここまでの作業が完了したら、変更を Git にコミットしておきましょう。

重要

コミットのタイミング

一連の修正が終わって区切りが付いたら、必ずコミットを行うことを習慣にしましょう。

コミットすべきタイミング:

  • プロジェクトの初期設定が完了した時

  • 新しい機能を追加した時

  • バグを修正した時

  • 一連の作業が完了した時

コミットのメリット:

  • 作業の履歴を残せる

  • 問題が起きた時に以前の状態に戻せる

  • 何を変更したかが明確になる

小さな変更でも、区切りが付いたらコミットする習慣をつけることが大切です。

3.10.1. .gitignore の設定

.gitignoreとは?

.gitignoreは、Git にコミットしたくないファイルやディレクトリを指定するファイルです。このファイルに記述されたパターンに一致するファイルは、git addしても無視されます。

警告

すべてのファイルをコミットするのは危険です

git add .で全てのファイルをステージングすると、以下のような不要なファイルもコミットされてしまいます:

  • *.pyc: Python のコンパイル済みファイル(自動生成される)

  • .venv/: 仮想環境(環境によって異なる)

  • db.sqlite3: データベースファイル(個人のデータが含まれる)

  • __pycache__/: Python のキャッシュディレクトリ(自動生成される)

これらのファイルをコミットすると、リポジトリが肥大化したり、個人情報が漏洩したりする危険があります。

.gitignoreの内容:

.gitignoreファイルに以下の内容と入替ます:

# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python

# 仮想環境
.venv/
venv/
env/
ENV/

# Django
*.log
db.sqlite3
db.sqlite3-journal
media/
staticfiles/

# 環境変数
.env
.env.local

# IDE
.vscode/
.idea/
*.swp
*.swo

# OS
.DS_Store
Thumbs.db

主な除外項目の説明:

パターン

説明

なぜ除外するか

__pycache__/

Python のキャッシュディレクトリ

自動生成されるため

*.pyc

Python のコンパイル済みファイル

自動生成されるため

.venv/

仮想環境

環境によって異なり、再作成可能

db.sqlite3

SQLite データベースファイル

個人のデータが含まれる可能性

.env

環境変数ファイル

機密情報(API キーなど)が含まれる

Tip

.gitignoreの確認方法

.gitignoreを設定した後、以下のコマンドで無視されるファイルを確認できます:

# 無視されるファイルを確認
git status --ignored

または、git addを実行する前に、git statusでコミット対象のファイルを確認しましょう。

変更をステージング:

.gitignoreを設定した後、変更をステージング(コミットの対象)します:

# 変更をステージング(.gitignore で除外されたファイルは自動的に無視される)
git add .

ステージング前の確認:

git add .を実行する前に、git statusでコミット対象のファイルを確認することをおすすめします:

# コミット対象のファイルを確認
git status

期待される出力:

On branch main

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   .gitignore
        new file:   manage.py
        new file:   server/settings.py
        new file:   server/urls.py
        new file:   game/models.py
        ...

db.sqlite3.venv/などのファイルが表示されていなければ、.gitignoreが正しく機能しています。

コミット:

# コミットメッセージを付けてコミット
git commit -m "feat: ゲーム用プロジェクトとアプリケーションの作成

- Django プロジェクト(server)を作成
- game アプリケーションを作成
- INSTALLED_APPS に game を追加
- マイグレーションを実行"

期待される出力:

[main (root-commit) abc1234] feat: ゲーム用プロジェクトとアプリケーションの作成
 10 files changed, 200 insertions(+)
 create mode 100644 manage.py
 create mode 100644 server/settings.py
 ...

Tip

コミットメッセージの書き方

本書では、Conventional Commits 形式のコミットメッセージを使用します:

<type>(<scope>): <subject>

<body>

例:

  • feat: 新機能を追加

  • fix: バグを修正

  • docs: ドキュメントを更新

参考:

これで、プロジェクトがゲーム開発用に整理されました。次の章から、本格的なゲーム開発を始めましょう。


3.11. 次のステップ

お疲れさまでした!第3章を完了しました。

この章で学んだこと:

  • [✓] Djangoの基本概念(MTV)

  • [✓] プロジェクトとアプリケーションの作成

  • [✓] 仮想環境の使い方

  • [✓] Hello Worldの表示

  • [✓] テンプレートの使い方

  • [✓] 管理画面の確認

  • [✓] よくあるエラーの対処法

  • [✓] ゲーム用プロジェクトの準備

次の章では:

  • ゲームの企画をLLMと一緒に考える

  • データモデルの設計

  • データベースの基本

いよいよ、本格的なアプリ開発に入ります。

チェックリスト

  • Djangoプロジェクトを作成できた

  • 開発サーバーが起動できた

  • "Hello, World!"が表示できた

  • テンプレートを使ってHTMLを表示できた

  • 管理画面にログインできた

  • エラーが出ても対処できる自信がついた

  • ゲーム用プロジェクト(adventure-game)を作成できた

  • gameアプリケーションを作成できた

  • スーパーユーザーを作成できた


次章: ゲームの企画とデータ設計