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

时间:2009-01-15 08:35:51

标签: python css django django-templates media

已经询问了这个问题的变化,但是在呈现模板时,我仍然无法正确加载样式表。

我正在尝试在开发过程中从Django进程中提供静态媒体 - 我很清楚这在生产中是非常不鼓励的。我会发布我的配置和模板,希望有人可以帮我理解我哪里出错了。

请注意,我确实尝试按照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/上打开。我觉得这让我感到困惑。

7 个答案:

答案 0 :(得分:51)

我必须自己解决这个问题。

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"

答案 1 :(得分:11)

Django已经有了MEDIA_URL的上下文流程,请参阅Django's documentation

默认情况下应该是availbale(除非你已经自定义了CONTEXT_PROCESSORS并忘了添加它)。

答案 2 :(得分:6)

我通常制作自己的Template简单标签,因为Django没有提供CSS / JavaScript文件。 Apache这样做,所以我的媒体网址通常是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">

您还可以让your own context preprocessor在每个模板中添加media_url变量。

答案 3 :(得分:2)

我只是使用绝对命名。除非你在一个很深的路径上运行网站(或者即使你是这样),否则我会删除..,然后去寻找类似的东西:

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

答案 4 :(得分:1)

我有几个想法,我不知道其中哪一个对我有效:)

  

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

那来自http://docs.djangoproject.com/en/dev/ref/settings/#admin-media-prefix

其次,您可能会将文件系统上的目录与url路径混淆。尝试使用绝对网址,然后将其细化。

答案 5 :(得分:1)

以为我很快就会发出声音。虽然这里的所有命题都运行得很好,而且我在开发时使用Ty的例子,一旦你投入生产,你可能想要选择通过直接的Apache,或者你正在使用的任何其他服务器来提供文件。

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

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

这样做的原因有两方面。首先,看起来Django在不需要时处理这些请求会更慢。其次,由于大多数浏览器实际上可以同时从3个不同的域下载文件,因此使用静态文件的第二个子域实际上可以加快用户的下载速度。

答案 6 :(得分:0)

要添加的另一件事是,如果子域/不同域上有单独的媒体服务器,则可以禁用静态媒体的cookie。节省一点处理和带宽。