看此篇文章之前,可以先參考
本文開始
在寫 django 時,我們會引用許多的 app,也會自行製作許多的 app,每一個 app 都可能有自己的 static 檔案或資料夾。
只要在 INSTALLED_APPS 裡引用的 app,便會成為 python manage.py collectstatic 的收集對象,而收集後存放的路徑,便是 STATIC_ROOT。
這麼一來便可以讓 app 有自己的 static 資料夾,不需要混在一起了,維護上也會簡單許多。
django default settings.py 裡面 STATIC_ROOT 的上方,也特別警告我們不應該手動更改 STATIC_ROOT 裡面的檔案。
有兩個情況我們需要設置 STATICFILES_DIRS
- 專案需要一個 static 檔案或資料夾,但卻不知該如何歸類在哪一個 app 底下。
- 專案需要改寫某個引用 app 底下的 static 檔案,但卻不希望動到原本 app 底下的 static 檔案。
狀況一我們有待商榷,畢竟「不知該如何歸類」不應該出現在一個成熟的專案下;而狀況二卻很容易發生。
此時便需要設置 STATICFILES_DIRS,越上方的設置優先權越高,而 STATICFILES_DIRS 的優先權當然也高於 INSTALLED_APPS 內的 app
(INSTALLED_APPS 本身也遵循越上方的 app 優先權越高的原則)
以 admin 舉例
我若要改寫 django/contrib/admin/static/admin/css/base.css,那麼便可如此指定
STATICFILES_DIRS = (
'/project/mystatic',
)
然後建立 /project/mystatic/admin/css/base.css 檔案後編輯,而後下達
python manage.py collectstatic
便會將 /project/mystatic/admin/css/base.css 收集到 STATIC_ROOT 的 admin/css/base.css 底下,並依照優先權決定覆蓋