Django管理媒体前缀URL issu

2024-04-24 11:56:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下文件夹结构

src\BAT\templates\admin\base.html
src\BAT\media\base.css
src\BAT\media\admin-media\base.css

设置.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',
)

网址.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文件。my 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>

我想得到URLhttp://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/


Tags: djangotextbaseadmintitletypelinkcontrib
2条回答

Django 1.4使用了一种新的策略来加载静态媒体文件,那些使用它的人将希望读取https://docs.djangoproject.com/en/dev/howto/static-files/

上述链接的执行摘要是,两个新的设置变量STATIC_URL和STATIC_ROOT与新包含的应用程序(django.contrib.STATIC files)一起使用,以收集和提供每个应用程序包含的静态文件。

升级django安装时,我必须将静态根设置为与以前的媒体URL相等。

在此系统下,模板现在应该使用{{STATIC}URL}。

对于Django 1.4及更新版本很重要(请参见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/.


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

^{}是一个绝对的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 %}在模板的开头。不幸的是,常规的媒体上下文处理器只提供媒体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")})

相关问题 更多 >