Ответ 1
Почему вы установили параметр MEDIA_ROOT
пустым? Это должен быть путь к вашему медиа-каталогу. Поскольку, как вы говорите, ваши медиафайлы находятся в подкаталоге media
, вы должны поместить его в MEDIA_ROOT
.
Я хотел бы любить Django, но это дело статических и медиафайлов в средах разработки меня заводит. Пожалуйста, спаси меня от моей глупости.
Я нахожусь на моей машине разработки. У меня есть папка media
в корне моей директории проекта.
В settings.py
у меня есть: MEDIA_ROOT = ''
и MEDIA_URL = '/media/'
.
В urls.py
у меня есть:
if settings.DEBUG:
urlpatterns += patterns('',
url(r'^media/(?P<path>.*)$',
'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT, }),
)
Но единственный способ получить медиафайлы - ссылка на /media/media/
например.
<img src="/media/media/image.png" />
.
Я ожидаю (и хочу) <img src="/media/image.png" />
Может ли кто-нибудь сказать мне, что здесь происходит, и дать мне простой рецепт настройки обработки медиафайлов?
Большое спасибо.
@Тимми О'Махони - спасибо! эпический пост, и очень ясный. Но он оставляет пару вопросов:
(1) Я должен использовать /media/
и /static/
, а не media/
и static/
как MEDIA_URL
и и STATIC_URL
- я что-то упустил?
(2) Если collectstatic
шланги /static/
, где вы помещаете CSS на уровне сайта, например. файлы CSS сайта? Не в /static/
, очевидно.
(3) Я поместил их в каталог "_" из корня проекта и установил STATICFILES_DIRS
, чтобы указать на него - и, похоже, сервер разработки получает свои статические файлы, несмотря на директиву urlpatterns
. Если это неверно, где вы добавляете CSS-уровень сайта во время разработки и каков рабочий процесс вокруг collectstatic
, когда вы их изменяете - вам нужно редактировать их на одном месте и собирать их где-то еще после каждого редактирования?
Почему вы установили параметр MEDIA_ROOT
пустым? Это должен быть путь к вашему медиа-каталогу. Поскольку, как вы говорите, ваши медиафайлы находятся в подкаталоге media
, вы должны поместить его в MEDIA_ROOT
.
Настройка папки:
Ваш корень проекта должен выглядеть примерно так:
/app1
/app2
/media
/static
/templates
urls.py
settings.py
manage.py
В папке media должны храниться такие вещи, как изображения, загрузки и другие материалы, которые могут быть загружены при обычном использовании веб-сайта (т.е. после завершения разработки)
В папке static предполагается хранить все CSS/JS и другие материалы, которые являются частью разработки сайта
Settings.py:
MEDIA_ROOT - это абсолютный путь к указанному выше статическому каталогу. Это означает, что это должно быть что-то вроде:
MEDIA_ROOT = "/User/Bob/Sites/MySite/Project_root/media/"
MEDIA_URL - это относительный URL-адрес браузера, с которым вы должны обращаться к медиафайлам, когда вы смотрите на сайт. Он должен быть (обычно)
MEDIA_URL = "media/"
что означает, что все материалы можно просмотреть на http://example.com/media/
Аналогично, STATIC_ROOT должно быть что-то вроде
STATIC_ROOT = "/User/Bob/Sites/MySite/Project_root/static/"
и STATIC_URL be
STATIC_URL = "static/"
Обслуживание файлов:
Теперь, когда вы сказали django, где эти папки должны быть, и правильные URL-адреса для доступа к ним, вам необходимо правильно обслуживать все запросы к папкам.
Обычно, когда вы находитесь в производстве, вы хотите, чтобы веб-сервер позаботился об обслуживании ваших статических файлов и медиафайлов.
Если вы развиваетесь, вы можете просто запустить сервер разработки django для их обслуживания.
Чтобы сделать это, вы сообщите ему, чтобы направлять весь запрос, который входит в http://example.com/media, на ваш MEDIA_ROOT и все запросы, которые входят в http://example.com/static на ваш STATIC_ROOT.
Для этого вы добавляете некоторые URLS в URLS.py, как вы:
from django.conf import settings
if settings.DEBUG:
urlpatterns += patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.MEDIA_ROOT,
}),
url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.STATIC_ROOT,
}),
)
Extra
Если у вас есть несколько приложений, каждый со своими CSS и JS файлами, вы можете не захотеть бросить их в одну/статическую/папку. Возможно, было бы полезно разместить их в подпапках приложений, к которым они принадлежат:
/app1/static/ # Specific static folder
/app2/static/
/media/
/static/ # Root static folder
Теперь ваш сервер webserver/development ищет только статические файлы, в которых вы сказали, чтобы он выглядел (т.е. корневая статическая папка), поэтому вам нужно собрать все файлы в подпапках и скопировать их в корневую статическую папку. Вы можете сделать это вручную, но django предоставляет команду для этого для вас (это весь смысл статического приложения)
./manage collectstatic
Я следил за процедурой timmy, но получил ошибку, которая не имеет имени модуля django.views
. Когда я использую import django.views
в моем virtualenv, все работает отлично. Это не проблема с импортом библиотеки.
Тем не менее, я смог решить эту проблему, выполнив эту процедуру в моем основном файле urls
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
В settings.py убедитесь, что вы добавили
django.core.context_processors.media
в вашем TEMPLATE_CONTEXT_PROCESSORS. В противном случае MEDIA_ROOT не будет работать, когда вы используете его в шаблонах.
Я использую Django 1.10. И моя медиа-папка - это "uploads" Это настройка в моих настройках .py:
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
MEDIA_URL = '/uploads/'
И в шаблоне я помещаю имя o my MEDIA_URL перед объектом object.name вместо object.url следующим образом:
<img src="uploads/{{ imagen_identificativa.name }} " alt="{{imagen_identificativa}}">
И это работает для меня. Надеюсь, это поможет.