想象一下这个非常简单的模型:
class Photo(models.Model): image = models.ImageField('Label', upload_to='path/')
我想从图像URL创建照片(即,不是在django管理站点中手动创建)。
我认为我需要做这样的事情:
from myapp.models import Photo import urllib img_url = 'http://www.site.com/image.jpg' img = urllib.urlopen(img_url) # Here I need to retrieve the image (as the same way that if I put it in an input from admin site) photo = Photo.objects.create(image=image)
如果不告诉我,我希望我已经很好地解释了问题。
谢谢 :)
编辑:
这可能有效,但我不知道如何转换content为Django文件:
content
from urlparse import urlparse import urllib2 from django.core.files import File photo = Photo() img_url = 'http://i.ytimg.com/vi/GPpN5YUNDeI/default.jpg' name = urlparse(img_url).path.split('/')[-1] content = urllib2.urlopen(img_url).read() # problem: content must be an instance of File photo.image.save(name, content, save=True)
我刚刚针对同一问题创建了http://www.djangosnippets.org/snippets/1890/。该代码与上面的pithyless答案类似,不同之处在于它使用urllib2.urlopen,因为urllib.urlretrieve默认情况下不执行任何错误处理,因此很容易获得404/500页面的内容,而不是你需要的内容。你可以创建回调函数和自定义URLOpener子类,但我发现像这样创建自己的临时文件更容易:
from django.core.files import File from django.core.files.temp import NamedTemporaryFile img_temp = NamedTemporaryFile(delete=True) img_temp.write(urllib2.urlopen(url).read()) img_temp.flush() im.file.save(img_filename, File(img_temp))