【问题标题】:Django Admin Media prefix URL issueDjango Admin Media 前缀 URL 问题
【发布时间】:2011-07-06 08:09:00
【问题描述】:

我有以下文件夹结构

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>

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

但我总是得到

<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/ 的 css 文件

直接访问http://localhost:8000/media/css/base.css 时显示来自 src/media/css/ 的 css 文件

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    对于 Django 1.4 和更新版本很重要(请参阅here):

    从 Django 1.4 开始,管理员的静态文件也遵循此约定,以使文件更易于部署。在以前的 Django 版本中,定义 ADMIN_MEDIA_PREFIX 设置来指向管理员的静态文件在 Web 服务器上的 URL 也是很常见的。此设置现已弃用并由更通用的设置 STATIC_URL 取代。 Django 现在将期望在 URL /admin/ 下找到管理静态文件。


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

    ADMIN_MEDIA_PREFIX 是一个绝对 URL 前缀,它与 MEDIA_URL 无关 - 两者都可以指向完全不同的点。诚然,名称中“_PREFIX”的(错误)选择在某种程度上暗示了这一点。

    因此,必须是 {% admin_media_prefix %}css/base.css,而不是 {{ MEDIA_URL }}{{ADMIN_MEDIA_PREFIX}}css/base.css。然后您必须确保 Web 服务器在“/admin-media/”上提供管理媒体文件。

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

    为了覆盖原版管理媒体服务,请在您的 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")})
    

    【讨论】:

    • &lt;link href="{{ ADMIN_MEDIA_PREFIX }}css/base.css" rel="stylesheet" type="text/css" /&gt; yields &lt;link href="css/base.css" rel="stylesheet" type="text/css" /&gt;
    • 我是否需要在 urls.py 上添加一些内容以确保 Web 服务器为“/admin-media/”上的管理媒体文件提供服务?请看我问题的最后一部分;哪些 css 文件在直接访问 URL 时得到输出
    • @Mithun:编辑了我的答案。使用媒体上下文处理器的模板中没有可用的 ADMIN_MEDIA_PREFIX 变量。另一个提示:如果您的设置中有 TEMPLATE_STRING_IF_INVALID = "(invalid variable '%s'!)" if DEBUG else "" 之类的内容,您会注意到这一点。
    • @Mithun:好吧,我以为你想提供原版管理文件?!如果不是,你需要用你自己的目录覆盖'/admin-media/' URL。
    • @Mithun:天哪,我花了 10 分钟来了解管理员如何为其媒体文件提供服务。提示:staticfiles.finders.AppDirectoriesFinder 在每个应用程序中查找“媒体”目录,包括管理应用程序。我将编辑我的答案以包含一个示例来覆盖它(希望不会被AppDirectoriesFinder 覆盖)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 2012-09-08
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多