【Django】おすすめのディレクトリ構成

更新日:
投稿日:

はじめに

Djangoを使ってWebアプリを開発していると、最初に悩むのが「どんなディレクトリ構成にすればいいか」ではないでしょうか。
私が開発しているアプリ(KakuhanApp)でも、最初はDjangoが自動生成したフォルダ構成のままで進めていましたが、アプリが大きくなるにつれて「どこに何を置いたか分かりにくい…」という問題が出てきました。

そこで今回は、私が実際に採用している おすすめのDjangoディレクトリ構成 を紹介します。
「設定ファイルの整理」「テンプレート・静的ファイルの一元管理」「共通処理の分離」といった工夫を中心に、紹介していきます。


1. Django標準構成の課題

Djangoでプロジェクトを作成すると、デフォルトでは次のような構成になります。

myproject/
├─ myproject/ # 設定フォルダ(プロジェクト名と同じ)
│ ├─ settings.py 
│ ├─ urls.py 
│ └─ ... 
├─ app1/ # アプリケーションフォルダ
├─ manage.py 

一見シンプルで良さそうですが、アプリが増えてくると

  • 設定ファイルの場所が分かりづらい(設定フォルダとプロジェクトフォルダの名前が同じでややこしい)

  • テンプレートやstaticファイルをまとめにくい

  • 共通処理をどこに置くか悩む

といった問題が出てきます。
そこで今回は、この構成をベースに「管理しやすく・拡張しやすい形」にカスタマイズしたものを紹介します。

2. おすすめ構成の全体像

まずは、KakuhanAppで採用しているディレクトリ構成を紹介します。

kakuhanapp/
├─ blog/ # アプリケーションフォルダ 
│ ├─ models.py 
│ ├─ views.py 
│ └─ ... 
├─ config/ # 設定フォルダ(Djangoの「myproject」相当)
│ ├─ settings/ # 環境別設定をまとめる
│ │ ├─ __init__.py
│ │ ├─ base.py
│ │ ├─ local.py
│ │ └─ production.py
│ ├─ urls.py
│ └─ ... 
├─ core/ # 共通処理フォルダ 
├─ static/ # 静的ファイル用フォルダ(CSS, JS, 画像など)
├─ templates/ # テンプレートフォルダ(HTMLを一元管理) 
│ ├─ blog/ 
│ └─ ... 
├─ manage.py 
├─ requirements.txt 
└─ ... 

この構成のポイントは3つです:

  1. 設定フォルダを「config」に変更し、さらに環境ごとに管理

  2. テンプレートと静的ファイルを共通化

  3. 共通処理を「core」で管理

これだけで、アプリ全体の見通しがぐっと良くなります。

 

設定フォルダの名前を変える方法はこちら↓

【Django】設定フォルダの名前を変える2つの方法(プロジェクト作成時・既存プロジェクト) プログラミング
【Django】設定フォルダの名前を変える2つの方法(プロジェクト作成時・既存プロジェクト)
投稿日:

3. 「config」フォルダで設定を整理

Djangoの設定ファイルは1つの settings.py にまとめるのが標準ですが、
開発用・本番用など環境によって設定を切り替えたい場合は、分割しておくと便利です。

KakuhanAppでは、以下のように config/settings/ フォルダを作り、環境ごとに設定を管理しています。

config/ 
├─ settings/ 
│ ├─ __init__.py 
│ ├─ base.py # 共通設定 
│ ├─ local.py # 開発環境用 
│ └─ production.py # 本番環境用 
  • base.py には全環境共通の設定を記述します。

  • local.pyproduction.py では、from .base import * で共通設定を読み込みつつ、環境固有の設定(DEBUG、DATABASESなど)を上書きします。

本番環境では production.py を使用し、manage.py 実行時に DJANGO_SETTINGS_MODULE を切り替える(以下を実行する)ことで安全に運用できます。

export DJANGO_SETTINGS_MODULE='config.settings.production' 

この方法を使うと、設定の衝突を防ぎつつ、環境に応じて柔軟に構成を切り替えられます。

4. 「templates」「static」の一元管理

アプリごとに templatesstatic フォルダを作る方法もありますが、
プロジェクトが大きくなると「どのアプリにどのHTMLがあるのか」管理が大変になります。

そのため、KakuhanAppでは プロジェクト直下に templates と static を設置 し、
すべてのアプリから共通で利用できるようにしています。

Django設定ファイル(config/base.py)では以下のようにパスを指定します。

TEMPLATES = [ { 'DIRS': [BASE_DIR / 'templates'], ... }, ] 

STATIC_URL = '/static/'
STATICFILES_DIRS = [ BASE_DIR / 'static', ] 

これで、どのアプリからでも共通のテンプレートや静的ファイルを扱えるようになります。
デザインを統一したいときにも非常に便利です。

5. 「core」で共通処理をまとめる

複数アプリ間で共通して使う関数やクラスを、
utils.py のように各アプリ内に分散させてしまうと管理が大変になります。

KakuhanAppでは、共通処理をまとめるために 「core」フォルダ を作成しています。

core/ 
├─ utils.py 
├─ mixins.py 
└─ forms.py 

このようにしておくと、
「共通関数は core/utils.py にある」とすぐにわかり、アプリごとの責務も明確になります。

後から新しいアプリを追加しても、共通処理をすぐに再利用できるのも大きなメリットです。

6. まとめ

Djangoは自由度が高いぶん、構成をどう設計するかがプロジェクトの継続性を左右します。
今回紹介した構成は、

  • 環境別設定で安全に開発・デプロイができる

  • 静的ファイルとテンプレートを一元管理できる

  • 共通処理を明確に分けられる

という3つの強みを持っています。また、今後アプリを拡張していく上でも柔軟に対応できる形になっています。

おわりに

最初はDjango標準構成でも問題なく動作しますが、アプリの規模が大きくなると「整理された構成」が開発効率を大きく左右します。

KakuhanAppでもこの構成に変更してから、「設定を切り替えやすい」「HTMLを探しやすい」「共通関数を使い回せる」など、開発体験が大幅に改善されました。

もしDjangoプロジェクトが少し煩雑に感じているなら、ぜひ今回紹介した構成を参考に、使いやすいフォルダ設計を試してみてください。

構成の見直しは一度きりの作業ではなく、アプリを育てていくための大切な一歩です。


記事一覧に戻る

関連記事

【Django】設定フォルダの名前を変える2つの方法(プロジェクト作成時・既存プロジェクト) プログラミング
【Django】設定フォルダの名前を変える2つの方法(プロジェクト作成時・既存プロジェクト)
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法 プログラミング
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法
サイトマップとは? - Djangoでサイトマップを自動で作成する方法 プログラミング
サイトマップとは? - Djangoでサイトマップを自動で作成する方法
Bootstrapでトーストを使う方法 ― ポップアップ通知の実装 プログラミング
Bootstrapでトーストを使う方法 ― ポップアップ通知の実装
テンプレートで「〜前」の形式で表示する方法 — Django の timesince を日本語化する プログラミング
テンプレートで「〜前」の形式で表示する方法 — Django の timesince を日本語化する

人気記事

はじめまして その他
はじめまして
閲覧数: 963
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編) プログラミング
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編)
閲覧数: 945
VScodeでPython、HTML/CSSコードを自動で整形する方法 プログラミング
VScodeでPython、HTML/CSSコードを自動で整形する方法
閲覧数: 351
X(旧Twitter)カードを正しく表示するためのHTMLの書き方 プログラミング
X(旧Twitter)カードを正しく表示するためのHTMLの書き方
閲覧数: 182
複数ページの重複モデルを整理して保守性・拡張性を上げる プログラミング
複数ページの重複モデルを整理して保守性・拡張性を上げる
閲覧数: 128

おすすめ記事

プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編) プログラミング
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編)
VScodeでPython、HTML/CSSコードを自動で整形する方法 プログラミング
VScodeでPython、HTML/CSSコードを自動で整形する方法
複数ページの重複モデルを整理して保守性・拡張性を上げる プログラミング
複数ページの重複モデルを整理して保守性・拡張性を上げる
サイトマップとは? - Djangoでサイトマップを自動で作成する方法 プログラミング
サイトマップとは? - Djangoでサイトマップを自動で作成する方法
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法 プログラミング
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法

記事へコメントする

コメント一覧(0件)

関連記事

【Django】設定フォルダの名前を変える2つの方法(プロジェクト作成時・既存プロジェクト) プログラミング
【Django】設定フォルダの名前を変える2つの方法(プロジェクト作成時・既存プロジェクト)
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法 プログラミング
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法
サイトマップとは? - Djangoでサイトマップを自動で作成する方法 プログラミング
サイトマップとは? - Djangoでサイトマップを自動で作成する方法
Bootstrapでトーストを使う方法 ― ポップアップ通知の実装 プログラミング
Bootstrapでトーストを使う方法 ― ポップアップ通知の実装
テンプレートで「〜前」の形式で表示する方法 — Django の timesince を日本語化する プログラミング
テンプレートで「〜前」の形式で表示する方法 — Django の timesince を日本語化する

人気記事

はじめまして その他
はじめまして
閲覧数: 963
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編) プログラミング
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編)
閲覧数: 945
VScodeでPython、HTML/CSSコードを自動で整形する方法 プログラミング
VScodeでPython、HTML/CSSコードを自動で整形する方法
閲覧数: 351
X(旧Twitter)カードを正しく表示するためのHTMLの書き方 プログラミング
X(旧Twitter)カードを正しく表示するためのHTMLの書き方
閲覧数: 182
複数ページの重複モデルを整理して保守性・拡張性を上げる プログラミング
複数ページの重複モデルを整理して保守性・拡張性を上げる
閲覧数: 128

おすすめ記事

プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編) プログラミング
プログラミング初心者が独学で1からPythonを学習し、資格取得・webアプリ作成まで。(資格取得編)
VScodeでPython、HTML/CSSコードを自動で整形する方法 プログラミング
VScodeでPython、HTML/CSSコードを自動で整形する方法
複数ページの重複モデルを整理して保守性・拡張性を上げる プログラミング
複数ページの重複モデルを整理して保守性・拡張性を上げる
サイトマップとは? - Djangoでサイトマップを自動で作成する方法 プログラミング
サイトマップとは? - Djangoでサイトマップを自動で作成する方法
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法 プログラミング
【Django】context_processorsとは?全テンプレートに共通変数を渡す方法

記事へコメントする

コメント一覧(0件)

シェアする