首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >手动填充ImageField

手动填充ImageField
EN

Stack Overflow用户
提问于 2015-11-23 11:16:12
回答 2查看 63关注 0票数 0

我有一个models.ImageField,有时我会用相应的forms.ImageField填充它。有时,我希望用ajax POST更新图像字段,而不是使用表单。我同时传递图像文件名和图像内容(base64编码),这样我就可以在api视图中得到我所需要的一切。但是我并不真正知道如何手动完成这个操作,因为我一直依赖于表单处理,表单处理会自动填充models.ImageField

如何手动填充具有文件名和文件内容的models.ImageField

编辑

我已达到以下地位:

代码语言:javascript
复制
instance.image.save(file_name, File(StringIO(data)))
instance.save()

这是在更新文件引用,使用在upload_toImageField中配置的正确值。

但是,它并不是在保存图像。我原以为第一个.save调用会:

  1. 在配置的存储中生成文件名。
  2. 将文件内容保存到选定的文件中,包括处理为该ImageField配置的任何类型的存储(本地FS、亚马逊S3或其他)
  3. 更新对ImageField中文件的引用

第二个.save实际上将更新的实例保存到数据库中。

我做错了什么?如何确保以自动生成的文件名将新的图像内容实际写入磁盘?

EDIT2

我有一个非常不满意的解决办法,这是工作,但是非常有限的。这说明了直接使用ImageField可以解决的问题:

代码语言:javascript
复制
# TODO: workaround because I do not yet know how to correctly populate the ImageField
# This is very limited because:
# - only uses local filesystem (no AWS S3, ...)
# - does not provide the advance splitting provided by upload_to
local_file = os.path.join(settings.MEDIA_ROOT, file_name)
with open(local_file, 'wb') as f:
    f.write(data)
instance.image = file_name
instance.save()

EDIT3

因此,经过更多的尝试之后,我发现我的第一个实现正在做正确的事情,但是如果传递的数据格式错误(我错误地传递了base64而不是解码的数据),就会悄无声息地失败。我会把这个作为解决方案

EN

回答 2

Stack Overflow用户

发布于 2015-11-23 13:39:55

只需保存文件和实例:

代码语言:javascript
复制
instance.image.save(file_name, File(StringIO(data)))
instance.save()

不知道这个程序的文档在哪里。

票数 0
EN

Stack Overflow用户

发布于 2015-11-23 13:41:56

您可以直接使用InMemoryUploadedFile保存数据:

代码语言:javascript
复制
file = cStringIO.StringIO(base64.b64decode(request.POST['file']))
image = InMemoryUploadedFile(file,
   field_name='file',
   name=request.POST['name'],
   content_type="image/jpeg",
   size=sys.getsizeof(file),
   charset=None)
instance.image = image
instance.save()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33869738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档