我有一个models.ImageField,有时我会用相应的forms.ImageField填充它。有时,我希望用ajax POST更新图像字段,而不是使用表单。我同时传递图像文件名和图像内容(base64编码),这样我就可以在api视图中得到我所需要的一切。但是我并不真正知道如何手动完成这个操作,因为我一直依赖于表单处理,表单处理会自动填充models.ImageField。
如何手动填充具有文件名和文件内容的models.ImageField?
编辑
我已达到以下地位:
instance.image.save(file_name, File(StringIO(data)))
instance.save()这是在更新文件引用,使用在upload_to中ImageField中配置的正确值。
但是,它并不是在保存图像。我原以为第一个.save调用会:
ImageField配置的任何类型的存储(本地FS、亚马逊S3或其他)ImageField中文件的引用第二个.save实际上将更新的实例保存到数据库中。
我做错了什么?如何确保以自动生成的文件名将新的图像内容实际写入磁盘?
EDIT2
我有一个非常不满意的解决办法,这是工作,但是非常有限的。这说明了直接使用ImageField可以解决的问题:
# 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而不是解码的数据),就会悄无声息地失败。我会把这个作为解决方案
发布于 2015-11-23 13:39:55
只需保存文件和实例:
instance.image.save(file_name, File(StringIO(data)))
instance.save()不知道这个程序的文档在哪里。
发布于 2015-11-23 13:41:56
您可以直接使用InMemoryUploadedFile保存数据:
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()https://stackoverflow.com/questions/33869738
复制相似问题