以编程方式将文件添加到Django ImageField

时间:2012-11-15 07:35:20

标签: python django urllib2

我正在尝试从URL下载图像文件,然后将该图像分配给Django ImageField。我按照例子here和[这里](

我的模型,在相关部分,看起来像这样:

class Entity(models.Model):

     logo = models.ImageField(upload_to=_getLogoPath,null=True)

_getLogoPath回调非常简单:

def _getLogoPath(self,filename):
    path = "logos/" + self.full_name
    return path

用于获取和保存图像文件的代码也很简单,作为我计划作为定期计划的cron作业运行的自定义django-admin命令的一部分:

...
img_url = "http://path.to.file/img.jpg"
img = urllib2.urlopen(img)
entity.logo.save(img_filename,img,True)
...

当我运行时,我收到此错误:

AttributeError: addinfourl instance has no attribute 'chunks'

我还尝试将read()添加到图片中,但却导致了类似的错误。我也尝试将图像写入临时文件,然后尝试上传,但我得到同样的错误。

1 个答案:

答案 0 :(得分:5)

如果您read the docs,您会看到entity.logo.save的第二个参数需要是django.core.files.File的实例

因此,要检索图像,然后使用图像字段保存​​图像,则需要执行以下操作。

from django.core.files import File

response = urllib2.urlopen("http://path.to.file/img.jpg")
with open('tmp_img', 'wb') as f:
    f.write(response.read())

with open('tmp_img', 'r') as f:
    image_file = File(f) 
    entity.logo.save(img_filename, img_file, True)
os.remove('tmp_img')

通过调用urlopen收到的对象不是图像本身。它的read方法将返回二进制图像数据。