2011-10-01 19 views
5

我已經全部通過了文檔,對我來說它沒有意義。我運行了collectstatic,我在我的應用程序和項目目錄中設置了/ static /目錄,我將STATIC_URL和STATIC_ROOT添加到我的settings.py文件中(但我不知道如何知道它們是否設置正確)和{ STATIC_URL}}仍然沒有渲染出任何東西。這一切似乎只是將html連接到css的一大堆矯枉過正。如何在開發中將CSS提供給Django?

我覺得我失去了在細節;任何人都可以提供這個靜態文件想法的高級細分?恐怕我可能對生產和開發設置有不同的說明。

更多:這是從我的settings.py文件的相關位:

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    # Uncomment the next line to enable the admin: 
    'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
    'django.contrib.staticfiles', 
    'dashboard.base', 
) 

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.debug', 
    'django.core.context_processors.i18n', 
    'django.core.context_processors.media', 
    'django.core.context_processors.static', 
    'django.contrib.auth.context_processors.auth', 
    'django.contrib.messages.context_processors.messages', 
) 

STATIC_ROOT = '' 
STATIC_URL = '/static/' 


STATICFILES_DIRS = (
    'C:/Users/Sean/Desktop/Work Items/dashboard/base/static/', 
) 

這是我想在我的模板的代碼:

<link rel="stylesheet" href="{{ STATIC_URL }}css/960.css" /> 

確定。我做了每個人都推薦的更改。這裏是我的新urls.py:

from django.conf.urls.defaults import * 
from base.views import show_project 
from django.conf import settings 
from django.contrib.staticfiles.urls import staticfiles_urlpatterns 

# Uncomment the next two lines to enable the admin: 
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = patterns('', 
# Example: 
# (r'^dashboard/', include('dashboard.foo.urls')), 

# Uncomment the admin/doc line below to enable admin documentation: 
# (r'^admin/doc/', include('django.contrib.admindocs.urls')), 

# Uncomment the next line to enable the admin: 
(r'^admin/', include(admin.site.urls)), 
('^show_project/$', show_project), 
) 

if settings.DEBUG: 
    urlpatterns += patterns('', 
     url(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT, 'show_indexes': True }), 
     url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT, 'show_indexes': True })) 

urlpatterns += staticfiles_urlpatterns() 

我錯過了什麼嗎?通常我的問題是CS專家認爲理所當然的基本問題,但我錯過了。

回答

4

下面是我的安裝過程。這聽起來像你可能錯過了靜態上下文處理器?

STATIC_ROOT和STATIC_URL

中的設置。在開發中使用PY:

STATIC_ROOT = '' 
STATIC_URL = '/static/' 

而且我的生產服務器上使用的settings.py:

STATIC_URL = '//static.MYDOMAIN.com/' 
STATIC_ROOT = '/home/USER/public_html/static.MYDOMAIN.com/' 

所以,所有的靜態文件位於static/。在生產服務器上,static/中的所有這些文件被收集到/home/USER/public_html/static.MYDOMAIN.com/,它們由不同的Web服務器(在我的情況下爲nginx)而不是Django提供。換句話說,我的django應用程序(在Apache上運行)甚至從未收到生產中靜態資產的請求。

背景處理器

爲了讓模板有STATIC_URL變量提供給他們,你需要使用django.core.context_processors.static背景處理器,在settings.py還定義:

TEMPLATE_CONTEXT_PROCESSORS = (
    # other context processors.... 
    'django.core.context_processors.static', 
    # other context processors.... 
) 

服務器靜態資產在開發中

Django不會在p中獲取對靜態資產的請求但是,在開發過程中,我們只是讓Django爲我們的靜態內容提供服務。我們在urls.py中使用staticfiles_urlpatterns來告訴Django服務於static/*的請求。

from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
# .... your url patterns are here ... 
urlpatterns += staticfiles_urlpatterns() 
+0

謝謝 - 我有處理器 - 你可以在我上面的文件中看到它。不過,您的設置對我有幫助:我在STATIC_ROOT和STATIC_URL設置中使用了絕對路徑。我已經修復了它,但我認爲我仍然需要STATICFILES_DIRS中的絕對路徑,對吧? – StormShadow

+2

@StormShadow,假設你的靜態文件和'settings.py'在同一個目錄下,你可以做'os.path.join(os.dirname(__ file __),「static」)'。 – Geo

+0

我認爲你沒有提到你是否使用Django開發服務器或其他服務器(如nginx或Apache)提供文件。如果第二個問題可能與您的生產服務器的配置有關,而與您項目中的配置設置無關。 – kaysa

2

看一看Serving static files in development。您需要定義STATIC_URLSTATICFILES_DIRS以讓django.contrib.staticfiles知道在哪裏查找文件。

+0

權。實際上,這就是我現在要做的事情。但它不起作用。我使用正斜槓並在C:/開始路徑。那是錯的嗎? – StormShadow

+0

順便提一句,它們都被設置爲相同的事物,因爲我不知道哪個實際設置了{{STATIC_URL}}變量。似乎都沒有工作。 – StormShadow

+0

他們不應該是一樣的。 STATICFILES_DIRS應該是您當前文件的位置,STATIC_ROOT應該是一個單獨的文件夾,您希望文件在收集時最終結束,STATIC_URL應該是您使用網站/應用程序時用於訪問文件的路徑 –

2

背後的靜態文件想法的想法是,你可以在每個應用分發開發相關的媒體文件(CSS/JS等),並允許靜態文件的應用程序來管理和收集所有這些資源的各種地方。

所以你告訴靜態文件應用程序在哪裏尋找靜態文件(通過設置STATICFILES_DIRS),在哪裏複製(STATIC_ROOT)以及訪問它們的路徑(STATIC_URL)。當您運行collectstatic時,它將搜索目錄並將其找到的所有文件複製到靜態根目錄中。

這樣做的好處是,你可以在一個更精細的LEVE管理您的靜態文件:

project/app1/static/css/ # These are css/js for a particular app 
project/app2/static/css/ 
project/app3/static/css/ 
project/static/css # These might be general css/js for the whole project 
static/ # This is where the collectstatic command will copy files to 

,你collectstatic後他們,你將有:

project/app1/static/css/ 
project/app2/static/css/ 
project/app3/static/css/ 
project/static/css 

static/app1/css/ 
static/app2/css/ 
static/app3/css/ 
static/css/ 

當你把你的應用程序/生產服務器上的網站時,讓web服務器(apache,nginx)通過告訴它在/ static /或/ media /中直接提供媒體文件來處理文件,同時將所有其他請求傳遞給應用程序。雖然開發時,讓開發服務器爲你做這件事更容易。

要做到這一點,你已經明確地告訴服務器是在/靜/(你STATIC_URL)媒體的任何請求。在你的urls.py中,輸入以下內容(或類似的內容)

from django.conf import settings 
... 
if settings.DEBUG: 
    urlpatterns += patterns('', 
     url(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT, 'show_indexes': True }), 
     url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT, 'show_indexes': True })) 
+0

是的那也不管用。它給我「NameError at/show_project/ 名稱'設置'未定義' – StormShadow

+0

您需要導入設置。我編輯了我的答案 –

+0

謝謝!但仍然沒有任何東西。我現在只是粘貼了其中的其他代碼。也許我已經忘記了那些東西? – StormShadow

0

我有同樣的問題,並搜索很多答案,但沒有人給我正確的答案。 問題是你不使用RequestContext我認爲。 你應該做一個RequestContext爲模板的參數一樣

c = RequestContext(request, { 
    'foo': 'bar', 
}) 

在我的看法是:

return render_to_response('parts/test2.html', RequestContext(request, locals())) 
相關問題