2011-10-17 33 views
1

我正在努力第一次編寫Django應用程序,所以如果我對事物有點落後,請耐心等待。我在做什麼Django靜態文件錯誤?

這裏是我的settings.py的摘錄:

STATIC_ROOT = os.getcwd().replace('\\','/') + '/static' 

STATIC_URL = '/static_files/' 

STATICFILES_DIRS = (
    os.getcwd().replace('\\','/') + '/static' 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
) 

注:我希望在os.getcwd()...線工作。我很確定這不是我的問題,但請讓我知道這是否是一個問題。它是本地開發用途的佔位符,所以在部署時不要擔心它留在那裏。

我的第一個問題是模板變量似乎沒有工作。

從我的主模板文件的摘錄:

<link rel="stylesheet" type="text/css" href="{{ STATIC_URL|default:'/static_files/' }}css/base.css" /> 

我本來剛剛在那裏{{ STATIC_URL }},而是簡單地返回任何內容,所以我嘗試添加|default:'...'。這已經成功地在生成的HTML中生成了給定的字符串,但仍然無法正常工作,這使我對第二個(也是更重要的,誠實的)問題產生了興趣。

我無法獲取靜態文件。我在這裏嘗試了幾種不同的方法。我試圖把絕對和相對路徑(以各種組合)在上述各STATIC_*變量的,我已經使用等效MEDIA_URL瓦爾代替嘗試過了,我試圖把下面進入我urls.py

urlpatterns = ('', 

    # ... 

    (r'^static_files/(?P<path>.*)$', 
     'serve', { 
      'document_root': '/path/to/django/dir/static_files/', 
      'show_indexes': True 
     } 
    ), 
) 

(我從http://www.arthurkoziel.com/2008/09/02/handling-static-files-django/中抓取了上面的代碼片段。)

現在我應該注意,一旦初始開發完成,我希望最終能夠從並行Apache進程提供靜態文件,但是我仍然很想知道我是什麼做錯了。我一直無法在線或在StackOverflow上找到有關靜態文件的完整教程。

非常感謝所有幫助。

編輯:萬一它很重要,我在Windows 7上使用Python 2.7。

回答

3

一種可能性 - STATIC_URL將不會填充到您的模板中,除非您傳入RequestContext。

確保你有你的看法是這樣的:

return render_to_response(template, context, context_instance=RequestContext(request)) 

由於Django的1.3,你也可以使用新的快捷方式:

return render(request, template, context) 

此外,還要確保你有「Django的。 core.context_processors.static'在你的上下文處理器中。


編輯:可能回答第二個問題,請嘗試更改

STATICFILES_DIRS = (
    os.getcwd().replace('\\','/') + '/static' 
) 

STATICFILES_DIRS = (
    os.getcwd().replace('\\','/') + '/static', 
) 

編輯2:更多可能的修復

可以刪除STATICFILES_FINDERS 。你只需要將它設置爲默認值,所以除非你打算稍後擴展它,否則就把它除掉(少一件出錯)。

你也可以去掉urlpatterns條目。不必要。

您的STATIC_ROOT可能不正確。這應該是Django在您轉移到生產環境時將收集整個項目中所有靜態文件(包括STATICFILES_DIRS中描述的目錄)的地方。

一個例子來自我的一個典型settings.py:

PROJECT_DIR = os.path.dirname(__file__) 

STATIC_URL = '/static/' 

STATICFILES_DIRS = (
    os.path.join(PROJECT_DIR, 'static'), 
) 

STATIC_ROOT = '/var/www/myproject_staticfiles/' 

這就是它!

如果你想測試的Django是否發現並正確地將您的靜態文件,嘗試運行

python manage.py collectstatic 

在我的情況下,將通過我的項目目錄,找到所有的靜態文件,然後將它們複製跨越'/ var/www/myproject_staticfiles /',我可以在這裏用apache託管它們。

Django dev服務器自動爲您的項目文件夾中的靜態文件提供服務,因此在dev中不需要collect_static。直到您投入生產時,您甚至不需要設置STATIC_ROOT。

+0

這絕對解決了我的第一個小問題。但是,我的第二個問題仍然存在。 –

+0

剛剛編輯了一個可能的解決您的第二個問題。 –

+0

不幸的是,這對我沒有任何幫助。我很確定添加一個逗號不會改變任何東西。它仍然以單個條目作爲元組結束。 –