| この記事の要点 |
|
Django で画像・CSS・JavaScript などの静的(static)ファイルを置く場所には、アプリ単位で作る方法とプロジェクト単位で作る方法の 2 つがあります。本稿ではアプリ単位でのディレクトリ作成方法と、開発・本番それぞれでの読み込みの仕組みを記述します。プロジェクト単位で作る方法はこちらを参照してください。
前提の設定(settings.py)
startproject で作ったプロジェクトなら、次の設定は最初から入っています。消していないか確認します。
INSTALLED_APPS = [
# ...
'django.contrib.staticfiles', # 静的ファイルを扱うアプリ
'app1', # 自分のアプリも登録しておく
]
STATIC_URL = 'static/' # 静的ファイルの URL の接頭辞
アプリが INSTALLED_APPS に登録されていないと、そのアプリの static フォルダは探索されません。
静的ファイル(画像、css、js)を格納するディレクトリ作成
アプリケーションフォルダ直下に static フォルダを作成し、さらに static フォルダ直下にアプリケーション名のフォルダを作成します。以下、アプリケーション名が app1 の場合の例です。
app1
-- static
-- app1
-- css
-- js
-- img
css、js、img フォルダを作成して、その配下にそれぞれのファイルを格納します。開発サーバーでは、以下の URL で静的ファイルにアクセスすることができます。
http://localhost:8000/static/app1/css/sample.css
なぜ static の下にアプリ名のフォルダを作るのか
Django は静的ファイルを探すとき、INSTALLED_APPS に並んだ各アプリの static フォルダを順番に見て、最初に見つかった同名ファイルを使います。もし app1 と app2 の両方に static/css/style.css があると、{% static 'css/style.css' %} はどちらか一方にしか解決されず、もう一方は使えません。
static/app1/css/style.css のようにアプリ名を一段挟めば、パスが app1/css/style.css と app2/css/style.css に分かれて衝突しません。テンプレートの templates/アプリ名/ と同じ考え方の「名前空間」です。
テンプレートからの読み込み
テンプレート(html ファイル)から静的ファイルを読み込む場合は以下のように指定します。
{% load static %}
<!DOCTYPE html>
<html lang="ja">
<head>
<link rel="stylesheet" href="{% static 'app1/css/sample.css' %}">
</head>
<body>
<img src="{% static 'app1/img/logo.png' %}" alt="ロゴ">
<script src="{% static 'app1/js/main.js' %}"></script>
</body>
</html>
{% load static %} はテンプレートファイルごとに必要です。親テンプレートで読み込んでいても、{% extends %} した子テンプレートで {% static %} を使うなら、子でも書きます。URL を /static/... と直書きせず {% static %} を使うと、STATIC_URL を CDN の URL に変えたときもテンプレートを直さずに済みます。
本番環境での配信(DEBUG = False のとき)
runserver が静的ファイルを自動で返すのは DEBUG = True の開発中だけです。本番で DEBUG = False にすると、CSS や画像が 404 になり、デザインが崩れた画面になります。本番では次の手順で配信します。
- settings.py に集約先
STATIC_ROOTを設定する python manage.py collectstaticを実行し、全アプリの static をそこへコピーする- Nginx / Apache で
STATIC_URLへのリクエストをSTATIC_ROOTから返す。または WhiteNoise ミドルウェアで Django 自身に配信させる
# settings.py
STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / 'staticfiles' # collectstatic の出力先(自分で作ったフォルダとは別にする)
python manage.py collectstatic
# Nginx の設定例
location /static/ {
alias /path/to/project/staticfiles/;
}
設定項目の違い
| 設定 | 役割 |
|---|---|
STATIC_URL | 静的ファイルの URL の接頭辞(/static/ など) |
アプリの static/ フォルダ | アプリ単位の置き場所。設定なしで自動的に探索される |
STATICFILES_DIRS | アプリに属さない、プロジェクト共通の置き場所を追加する |
STATIC_ROOT | 本番用に collectstatic で集める出力先。手でファイルを置く場所ではない |
MEDIA_URL / MEDIA_ROOT | ユーザーがアップロードしたファイル用。静的ファイルとは分けて管理する |
うまく読み込めないときの確認方法
- どのファイルに解決されるか調べる:
python manage.py findstatic app1/css/sample.cssを実行すると、実際に使われるファイルのパスが表示される。見つからなければ置き場所かパスのつづりが違う - 404 になる: アプリが
INSTALLED_APPSにない、フォルダ名がstaticsなどになっている、runserver を再起動していない(新しく作った static フォルダは再起動後に認識される場合がある) Invalid block tag ... 'static': そのテンプレートで{% load static %}を書き忘れている- CSS を変更しても反映されない: ブラウザのキャッシュ。スーパーリロード(Ctrl+F5)で確認する。本番ではファイル名にハッシュを付ける ManifestStaticFilesStorage を使うとキャッシュの問題を避けられる
- 本番だけ崩れる:
collectstaticの実行忘れ、または Web サーバーのaliasのパスの誤り
関連
- django テンプレートで css や javascript の静的ファイルを読み込む方法(プロジェクト単位)
- Django テンプレートの href の書き方|url タグと static・reverse
- Django settings.py の TEMPLATES 設定
- 【Laravel】個別のページに css や js を反映させる方法
子ページはありません
- 環境構築とプロジェクト/アプリの作成
- MVC(MVT)のそれぞれの使い方と説明
- データベースへの接続と操作
- Django Administration
- git管理
- エラー一覧
- バージョンの確認方法
- ログ出力方法
- SQLのログ出力方法
- ログのローテート設定
- settings.pyの定数にアクセスする方法
- 本番環境へのインストールとアプリのデプロイ(apache編)
- 本番環境へのインストールとアプリのデプロイ(nginx編)
- djangoアプリの本番の開始URLを変更する
- 静的(static)ファイルの置き場所と読み込み(画像、css、js )
- CSRFトークンをAjaxで使用する方法
- ajaxの使用例(POST編)
- ファイルのアップロードとファイルの名前
- クイックスタート/チュートリアル
- ログイン機能
- テンプレート側のログイン判定
- ビュー側のログイン判定
- 管理者ユーザーの作成/判定と管理画面
- モデルのjson化とレスポンス
- runserverでポートを指定する方法
- cronによるバッチ実行
- テンプレートで利用する共通のcontextを定義する方法
- プログラムが本番サーバーで反映されない場合の対処法
- APIの作成
- cron用コマンド・ファイルの作成
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38