2012年8月27日 星期一

區別 Django 中的 STATIC_ROOT 與 STATICFILES_DIRS

 

看此篇文章之前,可以先參考

深入了解 django 的 static 設定

 

本文開始

在寫 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

  1. 專案需要一個 static 檔案或資料夾,但卻不知該如何歸類在哪一個 app 底下。
  2. 專案需要改寫某個引用 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_ROOTadmin/css/base.css 底下,並依照優先權決定覆蓋

沒有留言:

張貼留言