Django: просмотр мультимедийных файлов ADMIN
Я успешно работал с медиафайлами для обычных файлов MEDIA, но когда я попробовал работать с медиа файлами администратора, я потерпел неудачу. пожалуйста, помогите мне найти проблему, так как я попытался устранить проблему уже несколько часов без везения (тоже был googling и прочитал django doc об обслуживании статических файлов).
Ошибка при попытке доступа к localhost: 8000/media/a.gif выглядит следующим образом:
Страница не найдена: F:\Python25\Lib\сайт-пакеты\Джанго/вно/администратор/медиа\a.gif
Я помещал файлы мультимедиа администратора в каталог с именем "media", в то время как я помещал обычные медиафайлы в каталог с именем "static". Я тоже в Windows.
Здесь, как я обслуживаю обычные медиа файлы в urls.py:
# serve static files
from django.conf import settings
if settings.ENVIRONMENT==settings.ENV_DEVELOPMENT:
urlpatterns += patterns("django.views",
url(r"%s(?P<path>.*)$" % settings.MEDIA_URL[1:], "static.serve", {"document_root": settings.MEDIA_ROOT,})
)
И мои settings.py(только важные фрагменты):
import project_path
MEDIA_ROOT = project_path.MEDIA.replace('\\','/')
MEDIA_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/media/'
TEMPLATE_DIRS = (
project_path.TEMPLATE.replace('\\','/'),
)
И мой project_path.py:
import sys
from os.path import dirname, join
ROOT = dirname(__file__)
APP = join(ROOT, "apps")
TEMPLATE = join(ROOT, "templates")
MEDIA = join(ROOT, "static")
ADMIN_MEDIA = join(ROOT, "media")
Любые подсказки?
или, возможно, по крайней мере, поделитесь тем, как вы обслуживаете свои медиа файлы администратора (без изменения каких-либо файлов с веб-сервера, но только через исходный код django)
Заранее спасибо:)
Ответы
Ответ 1
Ваш ответ заключается в том, что если ADMIN_MEDIA_PREFIX
явно не устанавливает домен
команда runerver будет обрабатывать файлы мультимедиа администратора из contrib.admin.
Меня тоже сожгли это волшебное поведение. Для этого был билет (Ticket # 8336), но конструктивное решение заключалось в том, чтобы оставить удобство и путаницу, как есть.
Итак, чтобы обслуживать ваши медиа-ресурсы администратора (для использования grappelli или любого другого скина, который вы хотите использовать) из ваших каталогов с помощью команды runserver
, вы должны использовать что-то вроде:
MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media/')
ADMIN_MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'admin-media/')
MEDIA_URL = '/site-media/'
ADMIN_MEDIA_PREFIX = 'http:/localhost:8000/admin-media/'
Надеюсь, что вернусь к правильному вопросу. Извиняюсь заранее.
Ответ 2
Рекомендуется запустить Dev-сервер несколько иначе [1]
python manage.py runningerver mydomain.com:8000 --adminmedia =/path/to/your/admin/media/
[1] http://code.google.com/p/django-grappelli/wiki/Installation
Ответ 3
Попробуйте
(r '^ admin_media/(.*)', 'django.views.static.serve', {'document_root': 'django/contrib/admin/media/', 'show_indexes': True}),
в вашем файле urls.py. И измените свой
ADMIN_MEDIA_PREFIX = '/admin_media/'
Ответ 4
Я просто исправил аналогичную ошибку на своем тестовом сайте. ADMIN_MEDIA_PREFIX и MEDIA_URL никогда не должны быть одинаковыми, см. Следующее примечание в docs:
Обязательно используйте конечную косую черту и чтобы это отличалось от MEDIA_URL (с того же URL-адреса не могут быть отображены на два разных наборов файлов).
Ответ 5
Попробуйте изменить:
ADMIN_MEDIA_PREFIX = '/static/media/'
Это предполагает, что ваш каталог MEDIA_ROOT/media/содержит папку с медиа-носителями (что я понял из вашего вопроса).
Ответ 6
Так как включение staticfiles в trunk (примерно 1.3, я считаю), магия ADMIN_MEDIA_PREFIX больше не используется.
В настоящее время сервер запускает ваш STATIC_URL + 'admin/'. Он тайно и молча перехватывает ваши запросы, игнорирует все ваши urlconf и пытается заставить вас сходить с ума.
Ответ 7
Попробуйте использовать STATICFILES_DIRS как удар
# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
("images", os.path.join(STATIC_ROOT,'images').replace('\\','/')),
("css", os.path.join(STATIC_ROOT,'css').replace('\\','/')),
("js", os.path.join(STATIC_ROOT,'js').replace('\\','/')),
)
Будьте добрыми!