我有以下文件夹结构
src\BAT\templates\admin\base.html
src\BAT\media\base.css
src\BAT\media\admin-media\base.css
settings.py
MEDIA_ROOT = os.path.join( APP_DIR, 'media' )
MEDIA_URL = '/media/'
ADMIN_MEDIA_PREFIX = '/admin-media/'
TEMPLATE_DIRS = (
os.path.join( APP_DIR, 'templates' )
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'django.contrib.admindocs',
)
urls.py
urlpatterns = patterns('',
(r'^admin/doc/', include('django.contrib.admindocs.urls')),
(r'^admin/', include(admin.site.urls)),
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)
我需要在我的应用程序中获取两个CSS文件。我的base.html包含
<head>
<title>{% block title %}{% endblock %}</title>
<link href="{{ MEDIA_URL }}css/base.css" rel="stylesheet" type="text/css" />
<link href="{{ MEDIA_URL }}{{ADMIN_MEDIA_PREFIX}}css/base.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/base.css{% endblock %}" />
{% block extrastyle %}{% endblock %}
<!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="{% block stylesheet_ie %}{% load adminmedia %}{% admin_media_prefix %}css/ie.css{% endblock %}" /><![endif]-->
{% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% admin_media_prefix %}css/rtl.css{% endblock %}" />{% endif %}
<script type="text/javascript">window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";</script>
{% block extrahead %}{% endblock %}
{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE" />{% endblock %}
</head>
我想获得以下网址http://localhost:8000/admin
<head>
<title>Site administration | My site admin</title>
<link href="/media/css/base.css" rel="stylesheet" type="text/css" />
<link href="/media/admin-media/css/base.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" href="/media/admin/css/base.css" />
<link rel="stylesheet" type="text/css" href="/media/admin/css/dashboard.css" />
但我总是得到
<head>
<title>Site administration | My site admin</title>
<link href="/media/css/base.css" rel="stylesheet" type="text/css" />
<link href="/media/css/base.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" href="/admin-media/css/base.css" />
<link rel="stylesheet" type="text/css" href="/admin-media/css/dashboard.css" />
直接访问http://localhost:8000/admin-media/css/base.css
时显示来自Python site-packages / django / contrib / admin / media / css的css文件
直接访问http://localhost:8000/media/admin-media/css/base.css
时显示来自src / media / admin-media / css /
直接访问http://localhost:8000/media/css/base.css
时显示来自src / media / css /
答案 0 :(得分:10)
对于Django 1.4及更新版本很重要(请参阅here):
从Django 1.4开始,管理员的静态文件也遵循此约定,以使文件更易于部署。在以前的Django版本中,定义ADMIN_MEDIA_PREFIX设置以指向管理员静态文件在Web服务器上的URL也很常见。此设置现已弃用,并由更一般的设置STATIC_URL取代。 Django现在希望在URL&lt; STATIC_URL&gt; / admin /.
下找到admin静态文件
以前的答案,对于较旧的Django版本:
ADMIN_MEDIA_PREFIX
是一个绝对的URL前缀,它与MEDIA_URL
无关 - 两者都可以指向完全不同的点。不可否认,名称中的“_PREFIX”(错误)选择有点暗示了这一点。
因此,它必须是{{ MEDIA_URL }}{{ADMIN_MEDIA_PREFIX}}css/base.css
,而不是{% admin_media_prefix %}css/base.css
。然后,您必须确保Web服务器在'/ admin-media /'上提供管理媒体文件。
请注意,我使用了上面的admin_media_prefix
标记,该标记在模板的开头需要{% load adminmedia %}
。不幸的是,常规媒体上下文处理器仅为您提供MEDIA_URL变量。
要覆盖vanilla管理媒体服务,请在您的URLconf中尝试以下内容:
# A handy helper function I always use for site-relative paths
def fromRelativePath(*relativeComponents):
return os.path.join(os.path.dirname(__file__), *relativeComponents).replace("\\","/")
[...]
url("^admin-media/(?P<path>.*)$",
"django.views.static.serve",
{"document_root": fromRelativePath("media", "admin-media")})
答案 1 :(得分:3)
Django 1.4使用新策略加载静态媒体文件,使用它的人想要阅读https://docs.djangoproject.com/en/dev/howto/static-files/
上述链接的执行摘要是两个新的设置变量STATIC_URL和STATIC_ROOT与新添加的应用程序(django.contrib.staticfiles)一起用于收集和提供基于每个应用程序包含的静态文件
升级我的django安装时,我必须将STATIC_ROOT设置为等于我以前的MEDIA_URL。
在此系统下,模板现在应使用{{STATIC_URL}}。