Django:你如何提供媒体/样式表,并在模板中链接到它们

这个问题的变化已经被问到,但是当我的模板被渲染时,我仍然无法正确加载我的样式表。

我试图在开发过程中从Django进程中提供静态媒体 – 我知道这在生产中是强烈的不鼓励。 我会发布我的configuration和我的模板,希望有人可以帮助我了解我要去哪里错了。

请注意,我确实试图按照Django项目网站上的示例,但是没有提到如何从模板中引用样式表。 我也尝试过许多不同的相同的东西,所以我的代码/设置可能与上面描述的有些不同。

settings.py

MEDIA_ROOT = 'D:/Dev Tools/django_projects/dso/media' MEDIA_URL = '/media/' ADMIN_MEDIA_PREFIX = '/media/' 

urls.py

 from django.conf.urls.defaults import * from django.conf import settings from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', (r'^admin/(.*)', admin.site.root), (r'^ovramt/$', 'dso.ovramt.views.index'), ) if settings.DEBUG: urlpatterns += patterns('', (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}), ) 

在我的模板中:

 <head> <title> {% block title %} DSO Template {% endblock %} </title> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" > <link rel="stylesheet" type="text/css" href="../media/styles.css"> </head> 

我向你保证,文件(模板/媒体)在我的文件系统上是正确的目录。 如果有任何我需要提供的额外信息,请发表评论。


编辑:

我遇到的一个问题是使用“/”来预先设置我的链接。 如果正斜杠前置,则从站点的根目录打开链接。 如果没有正斜杠,则链接在当前级别打开。 一个例子:

www.example.com/application/有一个链接“/ app2 /和一个链接”app3 /“。
app2将在www.example.com/app2/上打开,app3将在www.example.com/application/app3/上打开。 这让我感到困惑。

我只是自己弄清楚了这一点。

settings.py:

 MEDIA_ROOT = 'C:/Server/Projects/project_name/static/' MEDIA_URL = '/static/' ADMIN_MEDIA_PREFIX = '/media/' 

urls.py:

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

模板文件:

 <link rel="stylesheet" type="text/css" href="/static/css/style.css" /> 

随着文件在这里:

 "C:/Server/Projects/project_name/static/css/style.css" 

Django已经有一个MEDIA_URL的上下文过程,参见Django的文档 。

它应该是可用的默认情况下(除非你已经定制了CONTEXT_PROCESSORS,忘记添加它)在一个RequestContext。

我通常做我自己的模板简单的标签,因为Django不给CSS / JavaScript文件。 Apache这样做,所以我的媒体url通常是http://static.mysite.com

yourApp / templatetags / media_url.py:

 from django.template import Library from yourapp.settings import MEDIA_URL register = Library() @register.simple_tag def media_url(): return MEDIA_URL 

在我的模板文件中:

 {% load media_url %} <link href="{{ media_url }}css/main.css" rel="stylesheet" type="text/css"> 

您也可以使您自己的上下文预处理器在每个模板中添加media_urlvariables。

我只是使用绝对命名。 除非你在深入的path上运行这个站点,否则我会放弃..并且去做一些事情:

 <link rel="stylesheet" type="text/css" href="/media/styles.css"> 

我有几个想法,我不知道他们中的哪一个为我工作:)

确保使用尾部斜杠,并使其与MEDIA_URL设置不同(因为同一个URL不能映射到两个不同的文件集上)。

这是从http://docs.djangoproject.com/en/dev/ref/settings/#admin-media-prefix

其次,这可能是你的文件系统上的目录与URLpath混淆。 尝试使用绝对url,然后细化它们。

只是觉得我很快就会响起。 尽pipe这里的所有命题都可以正常工作,而且我在开发过程中使用了Ty的示例,但是一旦您进行了生产,您可能希望select通过直接的Apache或您使用的其他服务器来提供文件。

我所做的是在开发完成后设置子域名,并将所有链接replace为静态媒体。 例如:

 <link rel="stylesheet" type="text/css" href="http://static.mydomain.com/css/style.css" /> 

这样做的原因是双重的。 首先,Django在不需要的时候处理这​​些请求似乎会变得很慢。 其次,由于大多数浏览器实际上可以从3个不同的域同时下载文件,因此为静态文件使用第二个子域实际上会加快用户的下载速度。

另外需要补充的是,如果您在子域/不同域上有单独的媒体服务器,则可以禁用静态媒体的Cookie。 节省一点处理和带宽。