我刚刚针对同一问题创建了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))