Django: Programmatically saving image from URL to FileField or ImageField

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.

5KbWT 
It'll all makes sense once someone puts it into perspective for you!

Sources

CSS: Horizontal scrollbar when using Facebook "fb-like" widget

This has been bugging me for a good while. Tracked it down to the Facebook "Like" widget taking up more horizontal real-estate than it should.

image

If I deleted the fb-like widget, everything would go back to normal. Unfortunately, that's not proper solution...

So why is it even showing up!?

  • Restricting the widths on the iframe didn't seem to do anything.
  • Restricting the width of the parent div didn't seem to do anything either.
  • Setting overflow hidden on the parent div didn't work.

So what now?

The answer lies a few elements above. The one just above the <script> tag. There's a hidden div #fb-root.FB_UI_Hidden, which has a div and iframe nested inside it.

That iframe is injected during load time and although out of sight, it has a width of 575px causing the horizontal scrollbar to show unnecessarily.

Solution? Well first, don't use overflow; hidden on the <body> tag as suggested here. That's just silly because it disables your scrollbars altogether.

The correct method is to target CSS styling to it and restrict the width.

.FB_UI_Hidden { width: 100px !important; }

That's it! Another one line wonder.

image

Source

 
Copyright © Twig's Tech Tips
Theme by BloggerThemes & TopWPThemes Sponsored by iBlogtoBlog