Django: Media URL не установлен в шаблоне

Я прочитал много вопросов и статей, но не могу найти то, что мне не хватает.

вот мой conf:

settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(os.path.dirname(__file__),'static').replace('', '/'),
)

urls.py

urlpatterns = [
    url(r'^$', include('home.urls')),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^artist/', include('artists.urls')),
    url(r'photo/', include('photo.urls'))
]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

все равно, мои средства массовой информации обслуживаются, потому что, когда я иду в http://localhost:8000/media/path/to/image.формат JPG, у меня есть мой имидж.

но когда в шаблоне я делаю так :

<img class="avatar secondary-content" src="{{MEDIA_URL}}{{artist.artist_image}}">

у меня есть только путь к изображению. когда я изменение в html {{MEDIA_URL}} by ' / media/', он работает.

2 ответов


models.ImageField имеет свойство с именем url который дает вам просматриваемый путь вашего изображения.

вы должны использовать artist.artist_image.url вместо добавления MEDIA_URL к вашему имени изображения вручную:

<img class="avatar secondary-content" src="{{artist.artist_image.url}}" />

--

убедится artist_image не None, иначе называя .url выдает исключение.


вам нужно определение django.template.context_processors.media шаблон контекстный процессор в настройки для MEDIA_URL переменная, которая будет присутствовать в контексте шаблона.

если этот процессор включен, каждый RequestContext будет содержать переменная MEDIA_URL, обеспечивая значение MEDIA_URL настройка.

в папке settings будет MEDIA_URL в контексте шаблона. Это не включен по умолчанию в настройках Django 1.8. Нам нужно установите его явно.

context_processors = [
    ...
    'django.template.context_processors.media', # set this explicitly
]