Проблема с префиксом URL-адреса Django Admin Media

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

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 site-packages/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/


person Mithun Sreedharan    schedule 01.03.2011    source источник


Ответы (2)


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

Начиная с Django 1.4, статические файлы администратора также следуют этому соглашению, чтобы упростить развертывание файлов. В предыдущих версиях Django также было принято определять параметр ADMIN_MEDIA_PREFIX, указывающий на URL-адрес, по которому статические файлы администратора находятся на веб-сервере. Этот параметр устарел и заменен более общим параметром STATIC_URL. Теперь Django ожидает найти статические файлы администратора по URL-адресу ‹STATIC_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.

Чтобы переопределить медиа-обслуживание ванильного администратора, попробуйте что-то вроде этого в вашей конфигурации URL:

# 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")})
person AndiDog    schedule 01.03.2011
comment
<link href="{{ ADMIN_MEDIA_PREFIX }}css/base.css" rel="stylesheet" type="text/css" /> дает <link href="css/base.css" rel="stylesheet" type="text/css" /> - person Mithun Sreedharan; 01.03.2011
comment
Нужно ли мне что-то добавлять в urls.py, чтобы убедиться, что веб-сервер обслуживает медиафайлы администратора в «/admin-media/»? Пожалуйста, смотрите последнюю часть моего вопроса; какие файлы css получают вывод при прямом доступе к URL-адресам - person Mithun Sreedharan; 01.03.2011
comment
@Mithun: отредактировал мой ответ. У вас нет переменной ADMIN_MEDIA_PREFIX, доступной в шаблонах с обработчиком контекста мультимедиа. И еще подсказка: если бы у вас было что-то вроде TEMPLATE_STRING_IF_INVALID = "(invalid variable '%s'!)" if DEBUG else "" в настройках, вы бы это заметили. - person AndiDog; 01.03.2011
comment
@Mithun: Ну, я думал, ты хочешь обслуживать ванильные админ-файлы?! Если нет, вам нужно переопределить URL-адрес «/admin-media/» своим собственным каталогом. - person AndiDog; 01.03.2011
comment
<link href="{% admin_media_prefix %}css/base.css" rel="stylesheet" type="text/css" /> дает <link href="/admin-media/css/base.css" rel="stylesheet" type="text/css" /> из site-packages/django/contrib/admin/media/css. Но <link href="{{ MEDIA_URL }}{% admin_media_prefix %}css/base.css" rel="stylesheet" type="text/css" /> дает <link href="/media//admin-media/css/base.css" rel="stylesheet" type="text/css" /> из src/media/admin-media/css/ (то, что я хочу!!) - person Mithun Sreedharan; 01.03.2011
comment
@AndiDog, да, я не хочу, чтобы css по умолчанию поставлялся с администратором Django, я пытаюсь переопределить его с помощью своего собственного пользовательского файла css администратора. - person Mithun Sreedharan; 01.03.2011
comment
@Mithun: Рекламируй, что я хочу!! - это чистое совпадение, потому что у вас есть структура папок media/admin-media. Используйте любой MEDIA_URL или admin_media_prefix! Итак, если вы хотите использовать media/admin-media в качестве административного носителя, почему бы просто не изменить settings.ADMIN_MEDIA_PREFIX на '/media/admin-media/'? Но я не совсем уверен, перезаписывает ли приложение администратора этот URL-адрес, попробуйте. - person AndiDog; 01.03.2011
comment
@AndiDog, проблема в том, что настройка ADMIN_MEDIA_PREFIX = '/media/admin-media/' заставляет http://localhost:8000/media/admin-media/css/base.css загружаться из папки site-packages/django/contrib/admin/media/css - person Mithun Sreedharan; 01.03.2011
comment
@Mithun: OMG, мне потребовалось 10 минут, чтобы узнать, как администратор обслуживает свои медиафайлы. Подсказка: staticfiles.finders.AppDirectoriesFinder ищет каталог мультимедиа в каждом приложении, включая приложение администратора. Я отредактирую свой ответ, чтобы включить пример, чтобы переопределить это (надеюсь, это не будет перезаписано AppDirectoriesFinder). - person AndiDog; 01.03.2011
comment
ADMIN_MEDIA_PREFIX устарел. - person dan-klasson; 10.04.2013

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

person tjb    schedule 24.05.2012