プロジェクト単位かアプリケーション単位かで若干ファイルの配置場所と設定方法が違いますが、まずは settings.py の INSTALLED_APPS に「'django.contrib.staticfiles'」の記述があることを確認します。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # この記述があることを確認 'sample_django_app.apps.SampleDjangoAppConfig' ]
プロジェクト単位で使う static の場合
プロジェクトフォルダ(manage.py がある階層)に「static」フォルダを作成し、ファイルを配置。
settings.py の「STATICFILES_DIRS」にフルパスを追加することで、Django が静的ファイルを検索する際の検索対象となります。
collectstatic コマンド実行時のファイル取得元にもなります。
STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), ]
アプリケーション単位で使う static の場合
アプリケーションフォルダ直下に「static/アプリケーション名」のフォルダを作成し、ファイルを配置。
settings.py に「STATIC_URL = '/static/'」の記述があることを確認。
STATIC_URL = '/static/'
参考情報
項目 | メモ |
STATICFILES_DIRS | collectstatic が静的ファイルを追加検索する対象のディレクトリ(特定のアプリケーションに属さないものが対象) |
STATIC_ROOT | collectstatic 実行時に静的ファイルの集約先となるディレクトリ。下記STATIC_URL の参照先。 |
STATIC_URL | 公式ドキュメントには "URL to use when referring to static files located in STATIC_ROOT."(STATIC_ROOT にある静的ファイルを参照する時に使う URL)とあるので、「STATIC_ROOT を表向きの URL としては何と表すか」という事だと理解しています。 |
また、Django プロジェクト内の静的ファイルを探索するファイルファインダーと呼ばれる仕組みがあり、デフォルトでは下記2つが有効になっています。
- FileSystemFinder - STATICFILES_DIRS で指定されたディレクトリを探索する
- AppDirectoriesFinder - アプリケーションレベルの static ディレクトリを探索する
忘備録
アプリケーションレベルの static フォルダを作る際、お作法として直下にアプリケーション名のフォルダを作ってその中に静的ファイルを入れます。
例えば、「app_dir」というアプリケーションに対して「/js/app_script.js」というファイルを作る場合、「app_dir/static/app_name/js/app_script.js」となります。
本番環境で collectstatic コマンドを実行する際、下記の様に static ファイルがコピーされます。
そして、テンプレート上でアプリケーションレベルの静的ファイルを指定する時には「href="{% static 'app_name/css/style.css' %}"」という様にアプリケーション名を合わせて指定することになります。
上記例のテンプレート変数「static」は表向きの URL としては STATIC_URL が紐付き、実際は STATIC_ROOT で指定したディレクトリを参照します。