2012-11-15 68 views
3

我试图从URL下载图像文件,然后将该图像分配给Django ImageField。我跟着例子here和[这里](以编程方式将文件添加到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 

代码用于提取和保存图像文件也很简单,作为我计划以定期计划的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()的图像,但导致了类似的错误。我也尝试将图片写入临时文件,然后尝试上传,但我得到了同样的错误。

+0

你可以添加引发异常的代码部分吗? –

回答

5

如果read the docs,你会看到第二个参数entity.logo.save需要是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'。见[这个答案](http://stackoverflow.com/questions/1393202/django-add-image-in-an-imagefield-from-image-url/2141823#2141823)。 – osa

相关问题