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

Jos*_*ton 44 css python media django django-templates

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

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

请注意,我确实尝试按照Django项目网站上的示例进行操作,但是没有提到如何从模板中引用样式表.我也尝试过同一件事的许多不同变体,所以我的代码/设置可能与描述的有些不同.

settings.py

MEDIA_ROOT = 'D:/Dev Tools/django_projects/dso/media'
MEDIA_URL = '/media/'
ADMIN_MEDIA_PREFIX = '/media/'
Run Code Online (Sandbox Code Playgroud)

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}),
    )
Run Code Online (Sandbox Code Playgroud)

在我的模板中:

<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>
Run Code Online (Sandbox Code Playgroud)

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


编辑:

我遇到的一个问题是使用'/'前置我的链接.如果前缀为正斜杠,则从站点的根目录打开链接.如果没有正斜杠,则链接在当前级别打开.一个例子:

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

Ty.*_*Ty. 51

我只是想弄清楚自己.

settings.py:

MEDIA_ROOT = 'C:/Server/Projects/project_name/static/'
MEDIA_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/media/'
Run Code Online (Sandbox Code Playgroud)

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}),
    )
Run Code Online (Sandbox Code Playgroud)

模板文件:

<link rel="stylesheet" type="text/css" href="/static/css/style.css" />
Run Code Online (Sandbox Code Playgroud)

该文件位于此处:

"C:/Server/Projects/project_name/static/css/style.css"
Run Code Online (Sandbox Code Playgroud)

  • MEDIA_URL和ADMIN_MEDIA_PREFIX; 他们可以是一样的.这不是一个好主意. (5认同)

小智 11

Django已经有了MEDIA_URL的上下文进程,请参阅Django的文档.

默认情况下应该是免费的(除非您已经自定义了CONTEXT_PROCESSORS并忘了添加它)在RequestContext中.

  • 例如:<link rel ="stylesheet"type ="text/css"href ="{{MEDIA_URL}} styles.css"/>您也可以按照这一点来简化您在本地的开发:http://docs.djangoproject .COM/EN/1.0/HOWTO /静态文件/ (2认同)

bch*_*hun 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
Run Code Online (Sandbox Code Playgroud)

在我的模板文件中:

{% load media_url %}
<link href="{{ media_url }}css/main.css" rel="stylesheet" type="text/css">
Run Code Online (Sandbox Code Playgroud)

您还可以创建自己的上下文预处理器,以在每个模板中添加media_url变量.

  • 或者您可以使用内置的django.core.context_processors.media并执行相同的操作. (17认同)