2011-08-26 128 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/'