2011-08-26 133 views
1

我發現了很多關於如何做到這一點的不同示例,它們在設置MEDIA_URL,STATIC_URL,MEDIA_ROOT和MEDIA_URL時都略有不同。我的項目文件結構如下:用Django鏈接到樣式表

myproject/ 
    images/ (user-uploaded) 
    media/ (empty so far) 
    settings.py 
    static/ 
     css/ 
      styles.css 
     fonts/ 
    templates/ 
     auth/ 
      base.html 
      login.html 
     index.html 
    urls.py 

當然,根目錄下有應用程序目錄。對於我的圖像,顯​​示在指數模板,我這樣做:

urls.py:

from django.conf import settings 

(r'%s(?P<path>.*)' % settings.MEDIA_URL[1:], 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}), 

settings.py(這些是默認):

MEDIA_ROOT = '' 

MEDIA_URL = '' 

STATIC_ROOT = '' 

STATIC_URL = '/static/' 

ADMIN_MEDIA_PREFIX = '/static/admin/' 

網站我正在製作的只是一個頁面的前端。如何讓樣式表正確鏈接?我不確定所有這些目錄設置之間的區別是什麼,或者爲什麼我會用一個而不是另一個......或者什麼最好的方法(如果有的話)是結構化整個事情,在哪裏放置CSS, JavaScript,字體,靜態圖像,用戶上傳的圖像等。

回答

2

媒體是用於用戶上傳的文件,靜態 - 爲您的CSS和其他文件,所以您必須爲您的靜態文件,如js和css創建目錄。

你已經完成了所有的事情,因爲在Django官方文檔中有這樣的事情。我會離開我的朋友告訴過我做,到服務器的靜態文件在幾臺機器:

# settings.py 
PROJECT_DIR = os.path.dirname(os.path.abspath(__file__)) 
sys.path.insert(0, os.path.join(PROJECT_DIR, 'models')) 
PROJECT_URL = 'http://127.0.0.1:8000' 

MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media') 

MEDIA_URL = PROJECT_URL + '/media/' 

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

STATIC_URL = PROJECT_URL + '/static/' 

ADMIN_MEDIA_PREFIX = PROJECT_URL + '/static/admin/' 

# Additional locations of static files 
STATICFILES_DIRS = (
    os.path.join(PROJECT_DIR, 'static'), 
    os.path.join(PROJECT_DIR, 'media'), 
) 
# urls.py 
urlpatterns += patterns('', 
     (r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}), 
     (r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.STATIC_ROOT}), 
) 
+0

你甚至都不需要'MEDIA_URL'和'STATIC_URL'完整的URL路徑,你可以用「/媒體/」和「/靜/」。使用os絕對是最好的方法。 –

+0

@藝術 - 這是說'OS'沒有被定義... – katherine

+0

好吧,從來沒有...不知道多少Python,但添加進口操作系統,在頂部的sys固定它。這意味着什麼,因爲部署該網站的生活?這是否會被打破? – katherine

3

在前期的Django 1.3,有隻有兩個設置,沒關係:

MEDIA_ROOT :絕對文件系統路徑爲媒體文件

MEDIA_URL:絕對URL媒體文件,帶或不帶域

Post-Django 1.3引入了靜態文件contrib包,第一次很令人困惑。你需要進行如下設置:

MEDIA_ROOT:絕對的文件系統路徑用戶上傳

MEDIA_URL:絕對URL用戶上傳,帶或不帶域

STATIC_ROOT:絕對的文件系統靜態文件目錄的路徑。 這是collectstatic管理命令使用的文件夾。 請勿在此處手動放置任何文件。

STATIC_URL:絕對URL靜態文件目錄,有或 無域

然後,對於每個應用,你裏面創建一個「靜態」的目錄,並是你的靜態文件去。在開發中,Django根據STATIC_URL自動提供這些文件。在生產中,您必須運行collectstatic管理命令,將它們全部移動到項目的「靜態」目錄,然後該目錄是STATIC_URL下的服務器。

這一切都很好,但你可能會注意到這並不能真正覆蓋所有的東西。總是有項目範圍的靜態文件不一定屬於一個應用程序或另一個應用程序,但默認的靜態文件設置不會給你任何地方放置這些。因此,你必須採取事態入你自己的手中有額外的設置:

STATICFILES_DIRS = (
    "/absolute/path/to/myproject/assets/", 
) 

在這裏,我已經有一個名爲「資產」目錄,項目範圍內的靜態文件。無論你喜歡什麼,你都可以命名該目錄,但它不能與STATIC_ROOT相同。

絆人的最後一點是服務管理員媒體。所有你必須要做到這做的是包括設置:

ADMIN_MEDIA_PREFIX = STATIC_URL+'admin/'