Django Admin Media前缀URL问题 [英] Django Admin Media prefix URL issue

查看:157
本文介绍了Django Admin Media前缀URL问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下文件夹结构

  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,模板')

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 。''{'document_root':settings.MEDIA_ROOT}),


我需要在我的应用程序中获取这两个CSS文件。我的base.html包含

 < head> 
< title> {%block title%} {%endblock%}< / title>
< link href ={{MEDIA_URL}} css / base.css =stylesheettype =text / css/>
< link href ={{MEDIA_URL}} {{ADMIN_MEDIA_PREFIX}} css / base.css =stylesheettype =text / css/>
< link rel =stylesheettype =text / csshref ={%block stylesheet%} {%load adminmedia%} {%admin_media_prefix%} css / base.css {%endblock%} />
{%block extrastyle%} {%endblock%}
<! - [if lte IE 7]>< link rel =stylesheettype =text / csshref = {%block stylesheet_ie%} {%load adminmedia%} {%admin_media_prefix%} css / ie.css {%endblock%}/><![endif] - >
{%如果LANGUAGE_BIDI%}< link rel =stylesheettype =text / csshref ={%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%};< /脚本>
{%blockblock%} {%endblock%}
{%block blockbots%}< meta name =robotscontent =NONE,NOARCHIVE/> {%endblock%}
< / head>

我想获取以下输出的URL http:// localhost: 8000 / admin

 < head> 
< title>网站管理|我的网站admin< / title>
< link href =/ media / css / base.css =stylesheettype =text / css/>
< link href =/ media / admin-media / css / base.css =stylesheettype =text / css/>
< link rel =stylesheettype =text / csshref =/ media / admin / css / base.css/>
< link rel =stylesheettype =text / csshref =/ media / admin / css / dashboard.css/>

但我总是得到

 < HEAD> 
< title>网站管理|我的网站admin< / title>
< link href =/ media / css / base.css =stylesheettype =text / css/>
< link href =/ media / css / base.css =stylesheettype =text / css/>
< link rel =stylesheettype =text / csshref =/ admin-media / css / base.css/>
< link rel =stylesheettype =text / csshref =/ admin-media / css / dashboard.css/>

而直接访问 http:// localhost:8000 / admin-media / css / base.css 显示来自Python的css文件site-packages / django / contrib / admin / media / css



而直接访问 http:// localhost:8000 / media / admin-media / css / base.css 显示src / media / admin-media / css /

$ b中的css文件
$ b

直接访问 http:// localhost:8000 / media / css / base.css 显示src / media / css /

解决方案

Django 1.4及更高版本的重要信息(请参阅 here ):


Django 1.4,管理员的静态文件也遵循这个约定,使文件更容易部署。在以前的Django版本中,定义一个ADMIN_MEDIA_PREFIX设置来指向管理员的静态文件存在于Web服务器上的URL。此设置现在已被弃用,并被更一般的设置STATIC_URL所替代。 Django现在希望在URL< STATIC_URL> / admin /.






$ b下找到管理员静态文件$ b

以前的答案,对于较旧的Django版本:



ADMIN_MEDIA_PREFIX 是一个绝对的URL前缀,它与 MEDIA_URL - 两者都可以指向完全不同的点。诚然,名称中_PREFIX的(不好)选择有些暗示。



所以,而不是 {{MEDIA_URL}} { ADMIN_MEDIA_PREFIX}} css / base.css 它必须是 {%admin_media_prefix%} css / base.css 。然后你必须确保网络服务器在'/ admin-media /'上的管理媒体文件中。

请注意,我使用 admin_media_prefix 标签,在模板的开头需要 {%load adminmedia%} 。常规的媒体上下文处理器只能给您MEDIA_URL变量,不幸的是,



为了覆盖香草管理员媒体服务,请尝试在URLconf中这样做:

 #一个方便的帮助函数我一直用于站点相对路径
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 ,admin-media)})


i 've the following folder structure

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}),

)

I need to get both the CSS files in my application. my base.html contains

<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>

I want to get the following output for URL 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" />

But I always getting

<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" />

while direct accessing http://localhost:8000/admin-media/css/base.css shows css file from Python site-packages/django/contrib/admin/media/css

while direct accessing http://localhost:8000/media/admin-media/css/base.css shows css file from src/media/admin-media/css/

while direct accessing http://localhost:8000/media/css/base.css shows css file from src/media/css/

解决方案

Important for Django 1.4 and newer (see here):

Starting in Django 1.4, the admin’s static files also follow this convention, to make the files easier to deploy. In previous versions of Django, it was also common to define an ADMIN_MEDIA_PREFIX setting to point to the URL where the admin’s static files live on a Web server. This setting has now been deprecated and replaced by the more general setting STATIC_URL. Django will now expect to find the admin static files under the URL <STATIC_URL>/admin/.


Previous answer, for older Django releases:

ADMIN_MEDIA_PREFIX is meant to be an absolute URL prefix, it has nothing to do with the MEDIA_URL - both can point to completely different points. Admittedly, the (bad) choice of "_PREFIX" in the name somewhat suggests that.

So, instead of {{ MEDIA_URL }}{{ADMIN_MEDIA_PREFIX}}css/base.css it must be {% admin_media_prefix %}css/base.css. And then you have to ensure that the web server serves the admin media files on '/admin-media/'.

Note that I used the admin_media_prefix tag above, which needs {% load adminmedia %} at the beginning of the template. The regular media context processor only gives you the MEDIA_URL variable, unfortunately.

In order to override the vanilla admin media serving, try something like this in your 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")})

这篇关于Django Admin Media前缀URL问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆