from urllib import urlencode from urllib2 import urlopen, HTTPError from hashlib import md5 from django.db import models from django.conf import settings from django.core.files import File from django.core.files.temp import NamedTemporaryFile class CustomUser(...): # however you choose to subclass the user ... email = models.EmailField(max_length=254, unique=True) photo = models.ImageField(upload_to='users/photos', blank=True) slug = models.SlugField(unique=True, blank=True) ... def save(CustomUser, self).save(*args, **kwargs) """ Overrides CustomUser's save() method. Assumes that CustomUser has self.photo, self.email, and self.slug fields. Adjust code as necessary for your model. """ if not self.photo: base_url = 'http://{0}'.format(Site.objects.get_current().domain) default_photo = 'users/photos/generic_profile_photo.png' # use your own default_photo_url = base_url + settings.MEDIA_URL + default_photo # alternatively you can just use 'mm' here gravatar_base = 'http://www.gravatar.com/avatar/' gravatar_email = md5(self.email.lower()).hexdigest() gravatar_default = urlencode({'d': default_photo_url}) gravatar_query = '{0}{1}?{2}'.format(gravatar_base, gravatar_email, gravatar_default) try: tmp_photo = NamedTemporaryFile(delete=True) retr_photo = urlopen(gravatar_query) content_type = retr_photo.headers.getheader('Content-Type', None) file_type = None if content_type: if content_type == 'image/jpeg': file_type = 'jpg' elif content_type == 'image/png': file_type = 'png' elif content_type == 'image/bmp': file_type = 'bmp' elif content_type == 'image/gif': file_type = 'gif' elif content_type == 'image/tiff': file_type = 'tiff' tmp_photo.write(retr_photo.read()) tmp_photo.flush() # I'm using self.slug here to name the file, but it's not necessary self.photo.save('users/photos/{0}.{1}'.format(self.slug, file_type if file_type else 'png'), File(tmp_photo), save=True) except HTTPError: # as little can go wrong with users, so any HTTPError should just default self.photo = default_photo super(DJ, self).save(*args, **kwargs)