About Blog |

All articles, tagged with ”аватар”

Аватары для Django-проекта

Критикуйте :) Надеюсь, что кому-нибудь поможет. Данный пост показывает как добавить поддержку аватаров в блоговый движок Byteflow.

В settings.py (или settings_local.py) добавляем следующие настойки:

AVATAR_SIZE = (80, 80) #размеры аватара
AVATAR_UPLOAD_DIR="avsrc/" #директория для загрузки исходной картинки
AVATAR_DIR="avatars/" #директория хранения аватаров
AVATAR_DEFAULT="default.jpg" #файл аватара по умолчанию. находится в STATIC_URL/img

В /apps/accounts/models.py создаём модель аватара:

class UserAvatar(models.Model):
    """
    Avatar class for Amazon Byteflow blog engine
    """
    user=models.ForeignKey(User)
    original=models.ImageField("avatar", upload_to= settings.MEDIA_ROOT + "/" + settings.AVATAR_UPLOAD_DIR) 

    class Admin:
        pass

    def __unicode__(self):
        return self.user.username

    def create_avatar(self):  
        import Image
        im = Image.open(self.original)
        format = "JPEG"
        width, height = settings.AVATAR_SIZE
        im.thumbnail(settings.AVATAR_SIZE, Image.ANTIALIAS)
        im.save(self.user.get_avatar_filename(), "JPEG")

    def delete(self):
    if (self.user.get_avatar_path() <> ''):
        os.unlink(self.user.get_avatar_filename())
    super(UserAvatar, self).delete()       

    def save(self):
        if self.id:
            av = UserAvatar.objects.get(pk=self.id)
        if self.user.get_avatar_path() <> '':
            os.unlink(av.original)
        self.create_avatar()
        super(UserAvatar, self).save()

Затем создадим несколько функций:

def _avatar_url(self):
if (self.get_avatar_path() <> ''):
    return settings.MEDIA_URL + settings.AVATAR_DIR + str(self.id) + '.jpg'
else:
    return settings.STATIC_URL + 'img/'  settings.AVATAR_DIR + settings.AVATAR_DEFAULT

def _avatar_path(self):
    if os.path.exists(self.get_avatar_filename()):
        return self.get_avatar_filename()
    else:
        return ''

def _avatar_filename(self):
    return settings.MEDIA_ROOT + settings.AVATAR_DIR + str(self.id) + ".jpg"

def _new_delete_user(self):
    av = UserAvatar.objects.get(user=self)
    if not av is None:
        av.delete()    
    super(User, self).delete()

И навешиваем их на модель User:

User.get_avatar_url=_avatar_url
User.get_avatar_path=_avatar_path
User.get_avatar_filename=_avatar_filename
User.delete=_new_delete_user

Подмена метода delete связана с тем, что при удалении пользователя из базы данных необходимо удалять еще и аватары.

Теперь в шаблоне мы можем через object.author.get_avatar_url получить ссылку на аватар автора поста. По аналогии можно выводить аватары для пользователей, комментирующих пост. Остаётся всего лишь исправить шаблоны :)

PS. Это первая версия, написанная на коленке, поэтому не всё еще реализовано. Например, надо сделать в профиле пользователя форму для загрузки аватара.