This was a bit of a tricky one to figure out. The reason being we store our files not in the file system but using MogileFS, which required a custom Storage wrapper.
So our model looks a little something like this.
class Product(models.Model):
# other fields
image = models.FileField(storage = MogileFSStorage(), upload_to = 'product_images')
And that's completely fine if we're using the admin to manually upload image files.
However, if we wanted to programmatically save an image using code... Where do we begin?
I'm glad to say that it's actually easier than expected.
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
product = Product()
# set all your variables here
product.save()
# Save image
image_url = 'http://whatever.com/image.jpg'
img_temp = NamedTemporaryFile(delete = True)
img_temp.write(urlopen(image_url).read())
img_temp.flush()
product.image.save("image_%s" % product.pk, File(img_temp))
product.save()
And that's it! There's no need to worry about storage stuff because that's handled at the model declaration level.
This code should work fine for both FileField and ImageField.
Of course, how to access the file is completely up to you and out of the scope of this post.
It'll all makes sense once someone puts it into perspective for you!