已经提出了这个问题的变体,但在渲染模板时我仍然无法正确加载样式表。

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

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

设置.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 的文档.

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

我通常做我自己的模板简单的标记,因为Django是不给的CSS / JavaScript文件。阿帕奇做它,所以我的媒体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_URL变量。

我只是用绝对的命名。除非你是在一个很深的路径运行网站(或者即使你是),我会放下..,去是这样的:

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

我有一对夫妇的想法,我不知道它们中的哪一个为我工作:)

  

确认使用结尾的斜线,并且以具有这是从MEDIA_URL设置(因为相同的URL不能被映射到两个不同的文件集)不同。

这是从 HTTP://docs.djangoproject。 COM / EN的/ dev / REF /设置/#管理员媒体前缀

其次,它可能是你与URL路径文件系统混乱目录。尝试使用绝对URL,然后提炼下来。

只是想我会很快插入内容。虽然这里所有的命题工作得很好,我也用泰的例子同时发展,一旦你打生产你可能想选择通过直Apache的,或者你使用的其他任何一个服务器提供文件。

我做的是我设置一个子域名一旦我做开发,并取代所有链接到静止媒体。例如:

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

这样做的原因是双重的。首先,它只是好像这将是慢有Django的处理这些请求是没有必要的时候。其次,由于大多数浏览器实际上可以同时从3个不同的域下载文件,使用第二子域的静态文件实际上将加速用户的下载速度。

添加另一件事是,如果你有一个单独的媒体服务器上的子域/不同的域,你可以为你静止媒体禁用cookie。节省了很少的处理和带宽。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top