45

有人问过这个问题的变体,但是当我的模板被渲染时,我仍然无法让我的样式表正确加载。

我正在尝试在开发过程中从 Django 进程中提供静态媒体 - 我知道,在生产中强烈建议不要这样做。我将发布我的配置和模板,希望有人可以帮助我了解我哪里出错了。

请注意,我确实尝试遵循 Django 项目网站上的示例,但是它没有提到如何从模板中引用您的样式表。我还尝试了同一事物的许多不同变体,因此我的代码/设置可能与描述的有所不同。

设置.py

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

网址.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/ 打开.我想这让我很困惑。

4

7 回答 7

51

我只需要自己弄清楚这一点。

设置.py:

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

网址.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"
于 2009-01-15T18:56:51.770 回答
11

Django 已经有 MEDIA_URL 的上下文过程,请参阅Django 的文档

它应该在 RequestContext 中默认可用(除非您自定义了 CONTEXT_PROCESSORS 并忘记添加它)。

于 2009-01-26T10:49:00.467 回答
6

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

你的应用程序/模板标签/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_url 变量。

于 2009-01-15T18:40:22.227 回答
2

我只是使用绝对命名。除非您在很深的路径中运行该站点(或者即使您是),否则我会放弃..并选择以下内容:

<link rel="stylesheet" type="text/css" href="/media/styles.css">
于 2009-01-15T09:27:23.293 回答
1

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

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

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

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

于 2009-01-15T09:15:37.060 回答
1

只是以为我会很快插话。虽然这里的所有建议都很好,而且我在开发时确实使用了 Ty 的示例,但是一旦您投入生产,您可能希望选择通过直接 Apache 或您正在使用的任何其他服务器来提供文件。

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

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

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

于 2009-01-20T15:04:57.437 回答
0

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

于 2010-08-10T16:51:58.710 回答