Проблема с префиксом Django Admin Media - PullRequest
7 голосов
/ 01 марта 2011

У меня следующая структура папок

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 показывает файл css из пакетов сайта Python / django / contrib / admin / media / css

, а прямой доступ http://localhost:8000/media/admin-media/css/base.css показывает файл css из src / media / admin-media / css /

при прямом доступе http://localhost:8000/media/css/base.css показывает файл css из src / media / css /

Ответы [ 2 ]

10 голосов
/ 01 марта 2011

Важно для Django 1.4 и новее (см. здесь ):

Начиная с Django 1.4, статические файлы администратора также следуют этому соглашению, чтобы упростить развертывание файлов,В предыдущих версиях Django также было принято определять параметр ADMIN_MEDIA_PREFIX, чтобы указывать URL-адрес, на котором статические файлы администратора находятся на веб-сервере.Этот параметр теперь устарел и заменен более общим параметром STATIC_URL.Теперь Django ожидает найти статические файлы администратора по URL/admin/.


Предыдущий ответ, для более старых выпусков 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.

Чтобы переопределить обслуживание мультимедиа vanilla admin, попробуйте что-то подобное в вашем 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")})
3 голосов
/ 24 мая 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...