之前在網路投票應用中編寫測試程式,而現在要為它加上樣式和圖片。
除了服務端生成的 HTML 以外,網路應用通常需要一些額外的文件(例如:圖片、腳本和樣式表),來幫助渲染(render)網路頁面。在 Django 中,把這些文件統稱為“靜態文件”。
對於小專案來說,這個問題沒什麼大不了的,因為你可以把這些靜態文件隨便放在哪,只要服務程式能夠找到它們就行。然而在大專案——特別是由好幾個應用組成的大專案——中,處理不同應用所需要的靜態文件的工作就顯得有點麻煩了。
這就是 django.contrib.staticfiles 存在的意義:它將各個應用的靜態文件(和一些指明的目錄里的文件)統一收集起來,這樣一來,在生產環境中,這些文件就會集中在一個便於分發的地方。
首先,在你的 polls 目錄下創建一個名為 static 的目錄。Django 將在該目錄下查找靜態文件,這種方式和 Diango 在 polls/templates/ 目錄下查找 template 的方式類似。
Django 的 STATICFILES_FINDERS 設置包含了一系列的查找器,它們知道去哪裡找到 static 文件。AppDirectoriesFinder 是默認查找器中的一個,它會在每個 INSTALLED_APPS 中指定的應用的子文件中尋找名稱為 static 的特定文件夾,就像我們在 polls 中剛創建的那個一樣。管理後台採用相同的目錄結構管理它的靜態文件。
在你剛創建的 static 文件夾中創建一個名為 polls 的文件夾,再在 polls 文件夾中創建一個名為 style.css 的文件。換句話說,你的樣式表路徑應是 polls/static/polls/style.css。因為 AppDirectoriesFinder 的存在,你可以在 Django 中簡單地使用以 polls/style.css 的形式引用此文件,類似你引用模板路徑的方式。
靜態文件命名空間
雖然我們 可以 像管理模板文件一樣,把 static 文件直接放入 polls/static ——而不是創建另一個名為 polls 的子文件夾,不過這實際上是一個很蠢的做法。Django 只會使用第一個找到的靜態文件。如果你在 其它 應用中有一個相同名字的靜態文件,Django 將無法區分它們。我們需要指引 Django 選擇正確的靜態文件,而最簡單的方式就是把它們放入各自的 命名空間 。也就是把這些靜態文件放入 另一個 與應用名相同的目錄中。