# The file reference must be populated with a django.core.files.File instance
# but File cannot handle file-like objects such as those returned by urlopen -
# see http://code.djangoproject.com/ticket/8501
#
# Since we'd like to get the normal file name collision avoidance, automatic
# location handling, etc. we'll create a django NamedTemporaryFile because the
# default file storage save logic is smart enough to simply move the temporary
# file to the correct location.
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))
Comments
FYI, using 'delete=True' throws a TypeError under Django 1.1.1 -- NamedTemporaryFile's constructor doesn't expect the keyword.
Take it out and it works fine; great trick otherwise, thanks
#
Don't forget that File.save() does not delete any existing data. Use File.delete() if need be.
#