コンテンツにスキップするには Enter キーを押してください

【 Django 初心者向け】 Django がjavascript, css などのstaticファイルを認識しないときの対策まとめ

Last updated on 2022年3月13日

Django を利用して自分の個人開発プロジェクトを進めていたのですが、Staticファイルを認識させる部分で詰まったので、解決方法を共有しようと思います。

(僕の個人開発プロジェクトについては→http://takabot.com/2021/12/27/solodev_callmelater/

たぶん、ものすごく初歩的だと思いますが、上級者の方は「そんなのもあったなーw」と笑ってください。

さて、Dangoを使って開発しているときjavascriptファイルやcssファイルを認識してくれず、404 Errorが出ることがあります。

このとき、疑うべきこと、またそれぞれの対応法をまとめたので、ご覧ください。

よくある症例をまとめたので、ここに書いてある対応を取れば、大体は動作するようになると思います。

よくある順にまとめました。

確認1. Django の階層構造の中でstaticファイルは適切に配置されているか?

Djangoでは、javascript, cssなどの静的ファイルは適切な階層構造の中に保存されていなければなりません。

慣例上、javascript、 cssともにstaticという名前のファイルを作り、その中に保存します。

htmlを保存するtemplateフォルダもそうでしたが、自身のアプリケーションフォルダの下にstaticフォルダを作成し、更にその直下にアプリケーションフォルダと同名のフォルダを作成します。

これは同名の静的ファイルが存在した場合に衝突するのを防ぐためで、名前空間といいます。

つまり、ファイル構造は下記のようになります。

├── my application
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── models.py
│   ├── static
│   │   └── my application
│   │        └── layout.css
│   ├── templates
│   │   └── my application
│   │        └── index.html
│   └── views.py
├── manage.py
├── office
├── myvenv

一番上のmy applicationフォルダが自身の作成したアプリケーションフォルダ、その直下にstaticフォルダを作製し、その中にcssファイルを格納しています。これはjavascriptファイルでも同様です。

確認2.settings.pyに静的ファイルを設定しているか?

アプリケーションを作成したときと同じようにsettings.pyに静的ファイルを設定する必要があります。

設定は本来5通りありますが、今回の場合は下記の2通りでうまく行くはずです。

  • STATIC_ROOT
  • STATICFILES_DIRS

STATIC_ROOT

ターミナルで[python manage.py collectstatic フォルダ名]を実行することで、指定先のフォルダに静的ファイルをコピーし、集約することができます。本番環境でデプロイするときはこの操作が必要です。

STATICFILES_DIRS

共通して利用したい静的ファイルを、指定先に保存することで、すべてのアプリケーションなどで利用できるようになります。

settings.pyには上記のどちらもデフォルトでは記載されていません。

したがって手動で追記する必要があります。

settings.pyを開き、下の方にスクロールしていくと、下記の記述があります。

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.0/howto/static-files/

STATIC_URL = 'static/'

この下に、

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")
]

を追記してください。 ” “で囲まれたstaticが指定のフォルダです。

確認3.HTMLで読み込んでいるか?

読み込みたいjavascript, cssファイルをhtmlに記載する必要があります。

まず、CSS、JSファイルを読み込むhtmlファイルの先頭に{% load static %}と記述します。

{% load static %}
<html>
 :
</html>

さらに、JS,CSSを読み込みたい場所で、Djangoに認識させる必要があります。

<script src="{% static 'my_application/layout.css' %}"></script>

my_applicationの部分に自分のアプリケーション名を、

layout.cssの部分には読み込みたいjs, cssファイルの名前を入れてください。

Djangoを使っているとよく見る{ }で囲んでください。

これで、完成です。

それでも認識しないときは・・・

稀に、それでも認識しないときがあります。

そのようなときは、

1.スーパーリロード

2.キャッシュ削除

3.実行中のローカルサーバーをCTR+Cで一度停止し、もう一度python manage.py runserverを実行する

を試してみてください。

自分のときは、ローカルサーバーを一旦停止し、再度実行したらできたことがあります。

以上、自分が詰まった部分の共有でした!

参考:下記のサイト様を参考にさせていただきました。ありがとうございます!

ハイパー猫背: https://creepfablic.site/2019/11/20/django-static/#index_id3

Office54: https://office54.net/python/django/css-javascript-static#section4

コメントを残す

メールアドレスが公開されることはありません。