好吧,我已经尝试过几乎所有的东西,我无法让它工作 .
-
我有一个带有ImageField的Django模型
-
我有通过HTTP下载图像的代码(测试和工作)
-
图像直接保存到'upload_to'文件夹中(upload_to是在ImageField上设置的文件夹)
-
我需要做的就是将现有的图像文件路径与ImageField相关联
我已经用6种不同的方式编写了这段代码 .
我遇到的问题是我写的所有代码都会产生以下行为:(1)Django将生成第二个文件,(2)重命名新文件,在文件末尾添加_ name,然后(3)不传输任何数据,基本上是一个空的重命名文件 . 'upload_to'路径中剩下的是2个文件,一个是实际图像,一个是图像的名称,但是是空的,当然ImageField路径设置为Django尝试创建的空文件 .
如果不清楚,我会试着说明:
## Image generation code runs....
/Upload
generated_image.jpg 4kb
## Attempt to set the ImageField path...
/Upload
generated_image.jpg 4kb
generated_image_.jpg 0kb
ImageField.Path = /Upload/generated_image_.jpg
如果Django没有尝试重新存储文件,我怎么能这样做呢?我真正喜欢的是这个效果......
model.ImageField.path = generated_image_path
......但当然这不起作用 .
是的,我已经完成了其他问题,如this one以及File上的django doc
UPDATE 进一步测试后,它只在Windows Server上的Apache下运行时才会出现这种情况 . 在XP上的'runserver'下运行时,它不会执行此行为 .
我很难过 .
这是在XP上成功运行的代码...
f = open(thumb_path, 'r')
model.thumbnail = File(f)
model.save()
14 回答
我有一些代码可以从网上获取图像并将其存储在模型中 . 重要的是:
这有点令人困惑,因为它退出了我的模型并且有点脱离背景,但重要的部分是:
从web中提取的图像不存储在upload_to文件夹中,而是由urllib.urlretrieve()存储为临时文件,然后丢弃 .
ImageField.save()方法接受一个文件名(os.path.basename位)和一个django.core.files.File对象 .
如果您有疑问或需要澄清,请与我们联系 .
编辑:为了清楚起见,这里是模型(减去任何必需的import语句):
如果尚未创建模型,则非常简单:
First ,将您的图像文件复制到上传路径(假设= 'path/' 在以下代码段中) .
Second ,使用类似:
在django 1.4中测试和工作,它也适用于现有模型 .
只是一点点评论 . tvon答案有效,但是,如果你正在使用Windows,你可能想要
open()
文件'rb'
. 像这样:或者你将在第一个
0x1A
字节截断你的文件 .这是一个运行良好的方法,并允许您将文件转换为某种格式(以避免“无法将模式P写为JPEG”错误):
其中image是django ImageField或your_model_instance.image这里是一个用法示例:
希望这可以帮助
好的,如果你需要做的就是将现有的图像文件路径与ImageField相关联,那么这个解决方案可能会有所帮助:
好吧,如果认真的话,现有的图像文件将不会与ImageField相关联,但是此文件的副本将在upload_to目录中创建为“imgfilename.jpg”,并将与ImageField相关联 .
我做的是创建我自己的存储,不会将文件保存到磁盘:
然后,在我的模型中,对于我的ImageField,我使用了新的自定义存储:
如果你只想“设置”实际文件名,而不会产生加载和重新保存文件(!!)或使用charfield(!!!)的开销,你可能想尝试这样的事情 - -
这将点亮你的model_instance.myfile.url以及其他所有内容,就像你实际上传了这个文件一样 .
就像@ t-stone所说,我们真正想要的是能够设置instance.myfile.path ='my-filename.jpg',但Django目前不支持 .
我认为最简单的解决方案:
这可能不是您正在寻找的答案 . 但您可以使用charfield存储文件的路径而不是ImageFile . 这样,您可以以编程方式将上载的图像关联到字段,而无需重新创建文件 .
你可以试试:
您可以使用Django REST framework和python Requests库以编程方式将图像保存到Django ImageField
这是一个例子:
工作!您可以使用FileSystemStorage保存图像 . 检查下面的例子