DjangoのURL→View→Templateを理解してアプリの骨組みを作る【AIと一緒に作るDjangoブログ入門 #2】

DjangoのURL→View→Templateを理解してアプリの骨組みを作る【AIと一緒に作るDjangoブログ入門 #2】

Djangoの「URL → View → Template」という基本の流れを理解する章。blogアプリを作成し、INSTALLED_APPS登録・URL名前空間・テンプレートの名前空間化など、公式準拠の構造を学びます。

はじめに

前章でDockerの環境が整い、Djangoのデフォルト画面が表示されました。

この章ではblogアプリを作って自分のURLを設定します。

Djangoには「URL → View → Template」という決まった流れがあります。この仕組みを理解するのがこの章の一番大事なポイントです。


Djangoの仕組みを理解する

ブラウザで http://localhost/ にアクセスしたとき、裏側でこんな流れが起きています:

ブラウザ
  ↓ リクエスト
Nginx(ポート80)
  ↓ 転送
Django(ポート8000)
  ↓ urls.py がURLを判定
  ↓ views.py が処理
  ↓ templates/ がHTMLを生成
  ↑ レスポンス
ブラウザ(ページ表示)

Djangoの中だけ取り出すと:

ファイル 役割
urls.py どのURLにアクセスされたか判定する
views.py データを用意してテンプレートに渡す
templates/ HTMLを生成する

Step1. blogアプリを作る

cd ~/myblog
docker compose run --rm web python manage.py startapp blog

Djangoは機能ごとに「アプリ」を分けて管理します。今回は blog というアプリを作ります。

実行後にできるフォルダ:

~/myblog/
├ blog/
│  ├ migrations/   ← データベースの変更履歴
│  ├ __init__.py
│  ├ admin.py      ← 管理画面の設定
│  ├ apps.py       ← アプリの設定
│  ├ models.py     ← データベースのモデル
│  ├ tests.py      ← テスト
│  └ views.py      ← ページの処理
├ myblog/
└ manage.py

Step2. INSTALLED_APPSにblogを登録する

アプリを作っただけではDjangoに認識されません。settings.py に登録する必要があります。

~/myblog/myblog/settings.py を開いて INSTALLED_APPS に追加:

INSTALLED_APPS = [
    'blog.apps.BlogConfig',    # ← 追加
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

なぜ 'blog' ではなく 'blog.apps.BlogConfig' なのか?

blog/apps.py の中に BlogConfig というクラスが自動生成されています。アプリ名だけでなくこのクラスを指定することで、アプリの設定を細かく制御できます。公式チュートリアルもこの書き方を推奨しています。

📚 参考URLDjango 公式 - Applications

ココココ

INSTALLED_APPS にはここでは7個しか入れないけど、後の章で画像加工(imagekit)や SEO 用の sitemapssites も追加するよ〜。今はまず最小構成で動かそう!


Step3. テンプレートフォルダを作る

mkdir -p ~/myblog/blog/templates/blog

フォルダ構成:

blog/
└ templates/
    └ blog/        ← アプリ名で名前空間化(重要)
        └ index.html

なぜ blog/templates/blog/ と二重になっているのか?

Djangoはすべてのアプリの templates/ フォルダを横断して検索します。もし複数のアプリに index.html があると、どちらを使えばいいか区別がつきません。

blog/templates/blog/index.html とアプリ名のフォルダを挟むことで、'blog/index.html' として一意に特定できます。これが公式の推奨する書き方です。

📚 参考URLDjango チュートリアル Part 3 - 「テンプレートの名前空間」セクション
(ページ内検索で「テンプレートの名前空間」と探すと枠付きの注記ボックスが見つかります)


Step4. URLを設定する

blog/urls.pyを作る

touch ~/myblog/blog/urls.py

中身:

from django.urls import path
from . import views

app_name = 'blog'  # 名前空間の設定

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

path('', views.index, name='index') の意味:

  • '' → トップページ(http://localhost/)のURL
  • views.indexviews.pyindex 関数を呼び出す
  • name='index' → このURLに index という名前をつける(テンプレートから参照するときに使う)

myblog/urls.pyにblogを追加

~/myblog/myblog/urls.py を開いて修正:

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

urlpatterns = [
    path('health/', lambda request: HttpResponse('ok')),  # ヘルスチェック用
    path('', include('blog.urls')),                       # blogアプリのURLを追加
    path('admin/', admin.site.urls),
]

ヘルスチェック用URLについて

/health/docker-compose.yml のhealthcheckが「Djangoが正常に動いているか」を確認するためのURLです。ok と返すだけのシンプルなエンドポイントですが、本番環境でもロードバランサーの死活監視に使えます。

ココココ

ここでは myblog/urls.py には3つしか書かないけど、第7章で sitemap.xmlrobots.txt、第8章で404・500ページのカスタマイズを追加するよ。今は『URL → アプリに委譲』の流れを掴めばOK!

URLの流れ

http://localhost/
   myblog/urls.py
   include('blog.urls')  blog/urls.py に委譲
   path('', views.index) にマッチ
   views.index 関数を呼び出す

次章ではこの views.index 関数を実装して、画面を表示します。

関連記事

Markdownで記事を綺麗に表示する — コードハイライトと目次【AIと一緒に作るDjangoブログ入門 #6.1】
Django
Markdownで記事を綺麗に表示する — コードハイライトと目次【AIと一緒に作るDjangoブログ入門 #6.1】

第5章まで素のテキストだった記事本文を、Markdownで整形して表示できるようにする章。Python-Markdow…

Django記事詳細・カテゴリ・キーワード検索ページの実装【AIと一緒に作るDjangoブログ入門 #5】
Django
Django記事詳細・カテゴリ・キーワード検索ページの実装【AIと一緒に作るDjangoブログ入門 #5】

slug方式の記事詳細ページ、カテゴリ別の一覧、キーワード検索を実装。base.htmlでの共通レイアウト化、F()式…

Djangoのモデル設計とfixtureでブログのデータベースを作る【AIと一緒に作るDjangoブログ入門 #4】
Django
Djangoのモデル設計とfixtureでブログのデータベースを作る【AIと一緒に作るDjangoブログ入門 #4】

Post・Category・DisplaySlotの3つのモデルを設計し、管理画面で記事を管理できるようにする章。fi…