以编程方式将图像保存到Django ImageField
好的,我已经尝试了几乎所有内容,但无法正常工作。
- 我有一个上面带有ImageField的Django模型
- 我有通过HTTP下载图像的代码(已测试并且可以工作)
- 图像直接保存到“ upload_to”文件夹中(upload_to是在ImageField上设置的文件夹)
- 我需要做的就是将已经存在的图像文件路径与ImageField相关联
- 我已经用6种不同的方式编写了这段代码。
我遇到的问题是我正在编写的所有代码均导致以下行为:(1)Django将创建第二个文件,(2)重命名新文件,在文件末尾添加_名称,然后(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
…但是那当然不行。
是的,我已经经历这里的其他问题,如走了这一个,以及对Django的DOC 文件
更新 经过进一步测试,仅当在Windows Server上的Apache下运行时,它才会执行此行为。在XP上的“ runserver”下运行时,它不会执行此行为。
我很沮丧
这是在XP上成功运行的代码…
f = open(thumb_path, 'r')model.thumbnail = File(f)
model.save()
回答:
我有一些代码可以从网络上获取图像并将其存储在模型中。重要的位是:
from django.core.files import File # you need this somewhereimport urllib
# The following actually resides in a method of my model
result = urllib.urlretrieve(image_url) # image_url is a URL to an image
# self.photo is the ImageField
self.photo.save(
os.path.basename(self.url),
File(open(result[0], 'rb'))
)
self.save()
这有点令人困惑,因为它脱离了我的模型并且脱离了上下文,但是重要的部分是:
- 从Web提取的图像未存储在upload_to文件夹中,而是由urllib.urlretrieve()作为临时文件存储,之后被丢弃。
- ImageField.save()方法采用文件名(os.path.basename位)和django.core.files.File对象。
让我知道你是否有疑问或需要澄清。
编辑:为清楚起见,这里是模型(减去任何必需的import语句):
class CachedImage(models.Model): url = models.CharField(max_length=255, unique=True)
photo = models.ImageField(upload_to=photo_path, blank=True)
def cache(self):
"""Store image locally if we have a URL"""
if self.url and not self.photo:
result = urllib.urlretrieve(self.url)
self.photo.save(
os.path.basename(self.url),
File(open(result[0], 'rb'))
)
self.save()
以上是 以编程方式将图像保存到Django ImageField 的全部内容, 来源链接: utcz.com/qa/424683.html