Django:未在模板中设置MEDIA_URL

时间:2015-08-10 16:48:57

标签: python django python-3.x

我读过很多问题和文章,但找不到我错过的内容。

这是我的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}}">

我只有图像路径。当我用'/ media /'更改html {{MEDIA_URL}}时,它可以正常工作。

所以我的MEDIA_URL似乎没有设置在模板中,就我搜索而言,我看不到我错过的内容。

我在django 1.8.2上。如果您需要任何信息,请问我。

2 个答案:

答案 0 :(得分:14)

您需要MEDIA_URL变量的设置中定义django.template.context_processors.media模板上下文处理器才能出现在模板上下文中。

  

如果启用此处理器,则每个RequestContext将包含一个   变量MEDIA_URL,提供MEDIA_URL设置的值。

settings中包含此内容会在模板上下文中包含MEDIA_URL。在Django 1.8设置中默认不包含。我们需要明确设置。

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

答案 1 :(得分:14)

models.ImageField有一个名为url的属性,可以为您提供图像的可浏览路径。

您应该使用artist.artist_image.url而不是手动将MEDIA_URL添加到您的图片名称:

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

-

确保artist_image不是None,否则调用.url会引发异常。