由django模板呈现的媒体图像

时间:2018-03-22 13:50:26

标签: html django brokenimage

settings.py

INSTALLED_APPS = [...#'django.contrib.staticfiles',]

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

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

程序my_app / urls.py

urlpatterns = [
url(r'^welcome/', views.upload, name='upload'),] + 
static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

程序my_app /模板/ template.html

<img src='media/my_image.jpeg'>

程序my_app / views.py

def upload(request):
    if request.METHOD == 'POST:
    ...
        return redirect(to another page)
    return render(request, 'template.html')

template.html正确渲染,但图像已损坏。

当我尝试

curl -D - http://127.0.0.1:8000/my_app/welcome/media/my_image.jpeg

我得到200,当我在浏览器中转到欢迎URL后,后端返回

[22/Mar/2018 13:31:57] "GET /my_app/welcome/ HTTP/1.1" 200 411
[22/Mar/2018 13:31:57] "GET /my_app/welcome/media/my_image.jpeg HTTP/1.1" 200 411

所以我不认为这是一个网址问题。 Chrome正在显示图片。任何想法?

1 个答案:

答案 0 :(得分:3)

首先,您的正则表达式缺少$,因此它不仅与/welcome/匹配,还与/welcome/media/my_image.jpeg匹配(这就是您的curl命令返回状态代码的原因200)。将URL模式更改为:

url(r'^welcome/$', views.upload, name='upload'), 

接下来,您缺少前导斜杠以使其成为绝对URL。

<img src='/media/my_image.jpeg'>

最后,您需要为媒体文件和静态文件提供服务。 In development,您可以将以下内容添加到项目 urls.py中:

urlpatterns = [
    ...
]

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)