ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
Django とは(30 秒で)
Django は Python 製のフルスタック Web フレームワークで、「電池付き (batteries included)」が哲学。ORM、URL ルーティング、テンプレートエンジン、認証、管理画面、フォーム処理が標準搭載され、ニュースサイト用に作られた歴史から CMS / ブログ / 管理ツール用途に強い。Instagram、Pinterest、Disqus、Mozilla.org でも採用。
STEP 0: 前提
- Python 3.10 以上(Django 5.x の場合)
- pip が使える
- 仮想環境(venv / uv / poetry のいずれか)
python3 --version # 3.10+
pip --version
STEP 1: 仮想環境作成と Django インストール
# プロジェクト用ディレクトリ
mkdir mysite
cd mysite
# 仮想環境
python3 -m venv .venv
source .venv/bin/activate # Linux/Mac
# .venv\Scripts\Activate.ps1 # Windows
# Django インストール
pip install --upgrade pip
pip install django
# バージョン確認
django-admin --version
STEP 2: プロジェクト作成
django-admin startproject myproject .
# 末尾の "." で カレントディレクトリに直接展開
# 生成される構造
# mysite/
# ├── manage.py ← プロジェクトの司令塔
# ├── myproject/
# │ ├── __init__.py
# │ ├── settings.py ← 設定ファイル
# │ ├── urls.py ← URL ルーティング
# │ ├── asgi.py ← ASGI エントリポイント
# │ └── wsgi.py ← WSGI エントリポイント
# └── .venv/
STEP 3: 開発サーバを起動
# 初期マイグレーション(標準テーブル作成)
python manage.py migrate
# サーバ起動(デフォルト 8000 ポート)
python manage.py runserver
# 別ポート
python manage.py runserver 8080
# 外部からアクセス可能に
python manage.py runserver 0.0.0.0:8000
ブラウザで http://127.0.0.1:8000/ を開くと「The install worked successfully!」のロケット画面が表示されれば成功です。
STEP 4: アプリを作る (polls)
Django の「プロジェクト」は複数の「アプリ」の集合体です。1 つのアプリが 1 つの機能領域に対応します:
python manage.py startapp polls
# polls/
# ├── __init__.py
# ├── admin.py ← 管理画面の設定
# ├── apps.py ← アプリのメタ情報
# ├── migrations/ ← DB マイグレーション
# ├── models.py ← データ定義
# ├── tests.py ← テスト
# └── views.py ← リクエスト処理
myproject/settings.py の INSTALLED_APPS に追加:
# myproject/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls.apps.PollsConfig', # ★ 追加
]
STEP 5: Model(データ定義)
# polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text# マイグレーションファイル生成
python manage.py makemigrations polls
# Migrations for 'polls':
# polls/migrations/0001_initial.py
# - Create model Question
# - Create model Choice
# DB に反映
python manage.py migrate
# 何が実行されるか確認
python manage.py sqlmigrate polls 0001
STEP 6: 管理画面で確認
# スーパーユーザ作成
python manage.py createsuperuser
# Username: admin
# Email: admin@example.com
# Password: ********
# Password (again): ********
# サーバ起動
python manage.py runserver
# → http://127.0.0.1:8000/admin/ にログイン# polls/admin.py
from django.contrib import admin
from .models import Question, Choice
admin.site.register(Question)
admin.site.register(Choice)
管理画面に Question / Choice が表示され、ブラウザから追加 / 編集 / 削除できます。
STEP 7: View と URL
# polls/views.py
from django.http import HttpResponse
from django.shortcuts import render
from .models import Question
def index(request):
latest_questions = Question.objects.order_by('-pub_date')[:5]
return render(request, 'polls/index.html', {
'latest_questions': latest_questions,
})
def detail(request, question_id):
question = Question.objects.get(pk=question_id)
return render(request, 'polls/detail.html', {'question': question})# polls/urls.py
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.index, name='index'),
path('/', views.detail, name='detail'),
]
# myproject/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
STEP 8: Template
{# polls/templates/polls/index.html #}
{% if latest_questions %}
{% for q in latest_questions %}
- {{ q.question_text }}
{% endfor %}
{% else %}
No polls yet.
{% endif %}
これで http://127.0.0.1:8000/polls/ にアクセスすると質問一覧が表示されます。
Django の MTV パターン
MVC ではなく、Django は MTV (Model / Template / View) を採用:
| レイヤ | 役割 | ファイル |
|---|---|---|
| Model | データ定義と DB アクセス | models.py |
| Template | 表示テンプレート(HTML) | templates/ |
| View | リクエスト処理(一般的な MVC のコントローラ相当) | views.py |
| URLConf | ルーティング | urls.py |
公式チュートリアル(はじめての Django アプリ作成)
Django 公式は polls アプリを段階的に作る 7 パート構成のチュートリアルを提供しています:
| パート | テーマ |
|---|---|
| 1 | プロジェクト作成、初めての View、開発サーバ起動 |
| 2 | データベース、Model、admin サイト |
| 3 | View、URL ルーティング、テンプレート |
| 4 | フォーム、汎用 View(ListView / DetailView) |
| 5 | テストを書く |
| 6 | 静的ファイル(CSS / 画像) |
| 7 | admin のカスタマイズ |
他の定番チュートリアル
| 名前 | 特徴 |
|---|---|
| Django Girls Tutorial | HTML/CSS から解説。日本語訳あり。初心者向け |
| Mozilla MDN Local Library | 図書館アプリで Django Best Practice を学ぶ |
| Real Python Django | 個別テーマを深掘り(テスト / 認証 / DRF) |
| Awesome Django | GitHub の参考リソース集 |
つまずきやすいポイント
| 症状 | 原因 | 対処 |
|---|---|---|
TemplateDoesNotExist | templates ディレクトリの場所が間違い | アプリ内 templates/ 配置 + INSTALLED_APPS 確認 |
NoReverseMatch | URL 名の typo / app_name 不整合 | {% url 'polls:detail' q.id %} 形式を統一 |
You have NN unapplied migration(s) | マイグレ忘れ | python manage.py migrate |
OperationalError: no such table | 新規 Model 後に makemigrations 忘れ | makemigrations → migrate |
| CSRF token missing | POST フォームに {% csrf_token %} 無し | form タグ内に追加 |
次の学習ステップ
- Django REST Framework(DRF)で API 化
- Class-Based Views(汎用 View)への移行
- Bootstrap / Tailwind と組み合わせて UI
- PostgreSQL に切替
- Gunicorn + Nginx + Docker で本番デプロイ
- Celery で非同期タスク
FAQ
Q: startproject の最後の . は何?
A: 「カレントディレクトリに展開する」指示。省略すると myproject/myproject/ と入れ子になる。シンプルに展開したいなら . 付き推奨。
Q: 開発サーバを本番で使ってよい?
A: ダメ。runserver は開発専用で性能・セキュリティが本番向けでない。本番は Gunicorn / uWSGI + Nginx。
Q: SQLite から PostgreSQL に変えたい
A: DATABASES['default'] を変更 + psycopg2-binary インストール + migrate。データ移行は dumpdata → loaddata。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子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アノテーションとは
最近更新/作成されたページ
- SEO タイトル設計とキーワード配置完全ガイド (CTR / LLMO 対応) 2026-06-10 18:13:56
- Vue.js v-bind 完全ガイド (属性 / クラス / スタイル / Composition API) 2026-06-10 18:13:56
- Twitter (X) プラットフォーム完全ガイド 2026 (API / Premium / 競合) 2026-06-10 18:13:56
- PHP 変数スコープ完全ガイド (global / static / use / Arrow Function) 2026-06-10 18:13:56
- jQuery .height() 完全ガイド (innerHeight / outerHeight / box-sizing) 2026-06-10 18:13:56
- WordPress 主要独自関数完全ガイド (Loop / Enqueue / Hook / Conditional Tag) 2026-06-10 18:13:56
- jQuery 要素・値の削除完全ガイド (remove / detach / empty / val) 2026-06-10 18:13:56
- PHP コメント完全ガイド (// / # / /* */ / PHPDoc) 2026-06-10 18:13:56
- PHP 改行出力 (\n / PHP_EOL / nl2br) 完全ガイド 2026-06-10 18:13:56
- JavaScript 確認ダイアログ完全ガイド (confirm / alert / prompt / dialog) 2026-06-10 18:13:56
- UE5 スクリーンショット保存 (Scene Capture) 完全ガイド 2026-06-10 18:12:53
- UE5 Nav Mesh Bounds Volume 完全ガイド 2026-06-10 18:12:53
- EJS テンプレートの共通化 (include) 完全ガイド 2026-06-10 18:12:53
- UE5 カメラ傾き角度制限完全ガイド (Pitch Min/Max) 2026-06-10 18:12:53
- SQLite 完全ガイド (組み込み RDBMS) 2026-06-10 18:12:53
コメントを削除してもよろしいでしょうか?