【Django】MTVパターンとDjangoのディレクトリ構成を理解する

Django

こんにちは、かつコーチです。

前回の記事でdjango-admin startprojectを実行し、プロジェクトの雛形を作成しました。
でも、生成されたフォルダやファイルを見て「これは何のためのファイルなんだろう」と戸惑った人も多いはずです。

この記事では、Djangoの設計思想であるMTVパターンと、実際に生成されるディレクトリ構成の対応関係を解説します。

MTVパターンとは?

Model・Template・Viewの頭文字

MTVパターンとは、Djangoが採用しているアプリケーションの設計パターンで、Model(モデル)・Template(テンプレート)・View(ビュー)の頭文字を取ったものです。
それぞれの役割は以下の通りです。

  • Model:データベースとのやり取りを担当する部分。「どんなデータを、どんな形で保存するか」を定義する
  • Template:画面の見た目(HTML)を担当する部分。ユーザーに表示する内容を組み立てる
  • View:ModelとTemplateの橋渡しを担当する部分。リクエストを受け取り、必要なデータをModelから取得し、Templateに渡して画面を返す

役割ごとにファイルを分けることで、「デザインを変えたいだけなのにデータベースの処理まで触ってしまう」といった事故を防げます。

MVCとの違いで混乱しないために

Web開発を少し調べたことがある人なら、MVC(Model-View-Controller)という言葉を聞いたことがあるかもしれません。
DjangoのMTVは、実質的にMVCと同じ考え方ですが、呼び方と役割の対応が少し違います。

MVCDjango(MTV)役割
ModelModelデータの定義・DB操作
ViewTemplate画面の見た目
ControllerView処理の制御・橋渡し

つまり、MVCでいう「View(見た目)」がDjangoでは「Template」、MVCでいう「Controller(制御)」がDjangoでは「View」と呼ばれます。
筆者も最初にこの対応関係を知らず、「Djangoの View って結局何をする場所なんだ」と混乱した経験があります。名前の対応さえ覚えてしまえば迷わなくなるので、最初にここを押さえておくのがおすすめです。

Djangoのディレクトリ構成

startproject直後の全体構成

前回の記事でdjango-admin startproject config .を実行すると、次のような構成が生成されます。

myblog/
├── manage.py
├── config/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── asgi.py
│   └── wsgi.py

それぞれのファイルの役割を見ていきましょう。

manage.py:コマンド実行の窓口

manage.pyは、開発サーバーの起動やデータベースの操作など、Djangoのさまざまなコマンドを実行するための入り口となるファイルです。
python manage.py runserverのように、常にmanage.py経由でコマンドを実行します。

settings.py:プロジェクト全体の設定

settings.pyには、データベースの接続情報、タイムゾーン、インストール済みアプリの一覧など、プロジェクト全体の設定が記述されています。
初心者がまず触ることが多いのは、以下の項目です。

# config/settings.py
LANGUAGE_CODE = "ja"       # 言語設定を日本語に
TIME_ZONE = "Asia/Tokyo"   # タイムゾーンを日本時間に

デフォルトは英語・UTC(協定世界時)になっているため、日本向けのアプリを作る際は忘れずに変更しておきましょう。

urls.py:ルーティングの起点

urls.pyは、「どのURLにアクセスされたら、どの処理を呼び出すか」を定義するファイルです。
詳しくは次回の「urls.pyでルーティングを設定する基本」で扱いますが、ここではプロジェクト全体のURL設定の起点になっている、とだけ押さえておけば十分です。

アプリ単位のフォルダ構成

Djangoでは、プロジェクトの中にアプリ(app)という単位で機能を分割していきます。
例えばブログ機能を作る場合、次のコマンドでアプリを作成します。

python manage.py startapp blog

すると、以下のようなフォルダが追加されます。

blog/
├── migrations/
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── tests.py
└── views.py

MTVパターンとの対応で見ると、models.pyがModel、views.pyがView、そしてTemplate用のHTMLファイルを置くtemplates/フォルダは自分で作成する必要があります(Django標準では自動生成されません)。

よくあるつまずきポイント・エラー対処

プロジェクトとアプリの違いが分からなくなる

❌ Before
「config」も「blog」もどっちも似たようなフォルダに見えて、
どこに何を書けばいいか分からない

Djangoでは「プロジェクト(config)」は家全体、「アプリ(blog)」はその中の1つの部屋、とイメージすると理解しやすくなります。

✅ After
config/  → プロジェクト全体の設定(settings.py、全体のurls.py)
blog/    → 「ブログ機能」という1つの部屋(models.py、views.pyなど機能ごとの実装)

1つのプロジェクトの中に、複数のアプリ(部屋)を作って機能ごとに分割していくのがDjangoの基本スタイルです。

アプリを作っただけでは反映されない

❌ Before
python manage.py startapp blog
# アプリを作ったのに、なぜか動作に反映されない

アプリを作成しただけでは、Djangoはそのアプリの存在を認識しません。
settings.pyINSTALLED_APPSに追記する必要があります。

✅ After
# config/settings.py
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    # ...
    "blog",  # 作成したアプリを追加
]

筆者もこの登録を忘れて「モデルを書いたのにmigrateしても何も反映されない」と数十分悩んだことがあるので、アプリを作ったら必ずこの一手間を忘れないようにしましょう。

応用・一歩先の使い方

アプリの分割方針は後から効いてくる

初心者のうちは1つのアプリに全部詰め込んでしまいがちですが、規模が大きくなるプロジェクトでは「ユーザー管理」「ブログ機能」「決済機能」のようにアプリを機能単位で分けておくと、後々の保守がしやすくなります。
アプリ分割の考え方については、シリーズ後半の設計・アーキテクチャ編で詳しく取り上げます。

まとめ

この記事のポイント

  • MTVパターンは Model(データ)・Template(見た目)・View(制御)の3層で役割を分ける設計思想
  • MVCの「View」と「Controller」は、DjangoではそれぞれTemplate、Viewと呼ばれる点に注意
  • configフォルダはプロジェクト全体、blogのようなアプリフォルダは機能単位の部屋というイメージ
  • アプリを作成したらsettings.pyINSTALLED_APPSへの登録を忘れない

次に読むべき記事

ディレクトリ構成が分かったら、次はDjangoの入り口となる「urls.pyでルーティングを設定する基本」で、実際にURLと処理を結びつける方法を学んでいきましょう。

タグ: Django, 初心者向け, 入門

タイトルとURLをコピーしました