以编程方式将图像保存到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

…但当然不行。
是的,我已经经历了其他的问题,如this one以及File上的django文档
 UPDATE
进一步测试后,在Windows Server上的Apache下运行时,它只会执行此操作。在XP下的“runserver”下运行时,它不会执行此行为。
我被困了
这是在XP上成功运行的代码

f = open(thumb_path, 'r')
model.thumbnail = File(f)
model.save()

回答:

我有一些代码可以从Web上获取图像并将其存储在模型中。重要的是:

from django.core.files import File  # you need this somewhere
import 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]))
    )

self.save()

这有点混乱,因为它被拉出我的模型,有点不在上下文中,但重要的部分是:

  • 从web上拉出的图像是not存储在upload_to文件夹中,它被urllib.urlretrieve()存储为tempfile,后来被丢弃。
  • 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]))
                    )
            self.save()

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Programmatically saving image to Django ImageField

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

61 + = 67