簡體   English   中英

Django Admin Media前綴URL問題

[英]Django Admin Media prefix URL issue

我有以下文件夾結構

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

對於Django 1.4和更新版本很重要(見這里 ):

從Django 1.4開始,管理員的靜態文件也遵循此約定,以使文件更易於部署。 在以前的Django版本中,定義ADMIN_MEDIA_PREFIX設置以指向管理員靜態文件在Web服務器上的URL也很常見。 此設置現已棄用,並由更一般的設置STATIC_URL取代。 Django現在希望在URL <STATIC_URL> / admin /下找到admin靜態文件。


以前的答案,對於較舊的Django版本:

ADMIN_MEDIA_PREFIX是一個絕對URL前綴,它與MEDIA_URL - 兩者都可以指向完全不同的點。 不可否認,名稱中的“_PREFIX”(糟糕)選擇有點暗示。

因此,它必須是{% admin_media_prefix %}css/base.css ,而不是{{ 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")})

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM