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の管理もしやすくなります。
もし、書いてある通りやったけど動かねーぞこの野郎ってことがありましたら教えてください。どっか書き忘れてると思うので。