Проблем с 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="/bg{{ MEDIA_URL }}css/base.css" rel="stylesheet" type="text/css" />
<link href="/bg{{ MEDIA_URL }}{{ADMIN_MEDIA_PREFIX}}css/base.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" href="/bg{% 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="/bg{% block stylesheet_ie %}{% load adminmedia %}{% admin_media_prefix %}css/ie.css{% endblock %}" /><![endif]-->
{% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="/bg{% 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="/bg/media/css/base.css" rel="stylesheet" type="text/css" />
<link href="/bg/media/admin-media/css/base.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" href="/bg/media/admin/css/base.css" />
<link rel="stylesheet" type="text/css" href="/bg/media/admin/css/dashboard.css" />

Но винаги получавам

<head>
<title>Site administration | My site admin</title>
<link href="/bg/media/css/base.css" rel="stylesheet" type="text/css" />
<link href="/bg/media/css/base.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" type="text/css" href="/bg/admin-media/css/base.css" />
<link rel="stylesheet" type="text/css" href="/bg/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, за съжаление.

За да замените медийното обслужване на 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")})
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