无法处理用户在开发期间上传的图像

时间:2016-06-29 14:31:10

标签: django

Django 1.9.7

你能帮我处理用户上传的图片吗?我设法保存图像。

但我无法向他们展示。到目前为止,这完全是关于开发阶段(非生产)。

最底层的代码示例显示我执行时的html"查看页面源"在Chrome中。这" src =" / home / michael / workspace /..."是绝对的道路。如果我创建这样的html并在没有web服务器的浏览器中打开它,它将起作用。

但是,我运行Django dev服务器时,图像无法显示。

你能帮我一把吗。

/pharchive/pharchive/settings.py

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

/pharchive/pharchive/urls.py

from django.conf.urls.static import static
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

/pharchive/masterdocument/models.py

class Image(AbstractDocument):
    image = models.ImageField(upload_to='images/%Y/%m/%d')

/pharchive/masterdocument/views.py

class ImageDetailView(DetailView):
    model = Image

/pharchive/masterdocument/templates/masterdocument/image_detail.html

<html>
    <img src="{{ object.image.url }}"/> 
</html>

查看源:http://localhost:8000/images/6/

<html>
    <img src="/home/michael/workspace/pharchive/media/images/2016/06/29/Screenshot_from_2016-02-23_205205.png"/>    
</html>

1 个答案:

答案 0 :(得分:0)

MEDIA_URL应该是上传媒体的根网址,例如:

MEDIA_URL = '/media/'

您已将其设置为复制上传媒体的文件夹的路径。

编辑:根据要求提供有关其工作原理的更多信息。

您要做的是存储用户提交的图像文件,然后将其提供给其他用户。要存储文件,您需要在文件系统中指定存储位置,在您的情况下:

/home/michael/workspace/pharchive/media/images/2016/06/29/Screenshot_from_2016-02-23_205205.png

Django通过连接这些部分来构建这条路径:

  • MEDIA_ROOT
  • ImageField的插值upload_to属性,此处'images/%Y/%m/%d'插值为images/2016/06/29
  • 文件名,此处为Screenshot_from_2016-02-23_205205.png

Django还在数据库中存储文件的路径,相对于MEDIA_ROOT,在您的情况下images/2016/06/29/Screenshot_from_2016-02-23_205205.png

现在,要将存储的文件提供给用户,首先需要通过URL访问它,此URL是通过将MEDIA_URL设置连接到数据库中存储的路径(可能已修改为使其生成)来构建的与URL兼容),此处为/media/images/2016/06/29/Screenshot_from_2016-02-23_205205.png

最后一步是在访问以前构造的URL时实际提供文件,通常在开发和生产中不会以相同的方式完成。

在开发中,Django devserver将用于提供文件,这就是为什么在DEBUG为真时添加url模式的原因。该url模式会将以MEDIA_URL/media/)开头的任何URL映射到将读取存储文件并返回其内容的视图。

出于性能原因,在制作过程中,您将使用专用的Web服务器来提供上传的文件。