通过编程将文件添加到Django ImageField

5
我试图从一个URL下载图片文件并将该图片分配给Django ImageField。我已经按照这里和[这里](的示例进行操作。
我的模型,关键部分如下:
class Entity(models.Model):

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

_getLogoPath回调函数非常简单:

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

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

...
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()添加到图像中,但结果出现了类似的错误。我还尝试将图像写入临时文件,然后尝试上传该文件,但是仍然出现相同的错误。


请问您能添加引发异常的代码部分吗? - Siddharth Sarda
1个回答

7
如果您阅读文档,您将会看到 django.db.models.FileField 的第二个参数需要是一个 django.core.files.File 的实例。
所以,要检索图像并使用 ImageField 保存它,您需要执行以下操作。
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方法会返回二进制图片数据。


1
你可以使用 from django.core.files.temp import NamedTemporaryFile 替代 tmp_img。请参考这个回答 - Sergey Orshanskiy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接