人生セルフ人体実験

何をするにしても自分で試すのが一番

Djangoでtemplatesやstaticをアプリ間で共有する方法メモ

Djangoをいじっていたらtemplatesやstaticを複数のアプリ間で共有したいケースに遭遇しまして、
別にあるアプリのフォルダ内に入っていても他アプリから画像とかcssとか参照できるんですが、アプリフォルダの外側に独立していたほうが階層も浅くなって見た目スッキリします(個人の価値観)。
で、なんかわかりやすくまとまってたナレッジが無かったので、その方法をまとめたメモです。
わかりやすくなったかどうかはさておき。

前提

Djangoのバージョンは3.0。
Djangoプロジェクトの中で、

  • アプリそれぞれがtemplatesフォルダ、その中に共通htmlを別々に持っている
  • staticフォルダはある一つのアプリ内にあって、他アプリもそこを参照している

という状態。

いじる前のファイル構造例

sampleapp
├-sampleapp # こいつがメインアプリのフォルダ
│ ├-templates
│ │ └-sampleapp
│ │  └-index.html
│ │  └-base0.html
│ └-static # これは全アプリで共有してるから外に出したい
│  ├-css
│  └-img
├-app1
│ └-templates
│   └-app1
│    └-page1.html
│    └-base1.html 
├-app2
│ └-templates
│   └-app2
│    └-page2.html
│    └-base2.html # base1.htmlと同じ内容なので共有させたい
├-manage.py
└-venv

変更後のファイル構造例

sampleapp
├-sampleapp
├-app1
├-app2
├-templates
│ ├-base0.html
│ ├-base1.html
│ ├-sampleapp
│ │ └-index.html
│ ├-app1
│ │ └-page1.html
│ └-app2
│   └-page2.html
├-static
│ ├-css
│ └-img
├-manage.py
└-venv

templatesを共有する

settings.pyを書き換える

settings.pyに以下を追記(既にやっていたらスルーしてください)。

TEMPLATES = [
    {
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
]

templatesフォルダと中身を移動する

一番外側のsampleappフォルダ直下にtemplatesフォルダを作成。
あとは先述の変更後のファイル構造例に従い、各アプリからフォルダとファイルをコピーしてきます。
このときベースhtmlをアプリのtemplatesフォルダから出して新しく作ったtemplatesフォルダ直下に置いてあげると、各アプリから参照可能になります。

staticを共有する

settings.pyの設定をいじる

変更前はこんな感じになっているはずです。

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

これを以下の通り変更。

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

staticフォルダを移動する

こちらもtemplatesフォルダ同様、一番外のsampleappフォルダ直下にまるごとstaticフォルダをコピーします。
これだけ。

実装する

ここまでやれば、こんな感じでそのままhtmlに書いてあげると参照できるようになっているはずです。

{% extends 'base1.html' %}
<link rel="stylesheet" href="{% static 'css/base.css' %}">

だいぶフォルダ構造がすっきりして、templatesの管理もしやすくなります。
もし、書いてある通りやったけど動かねーぞこの野郎ってことがありましたら教えてください。どっか書き忘れてると思うので。