Аватары для 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. Это первая версия, написанная на коленке, поэтому не всё еще реализовано. Например, надо сделать в профиле пользователя форму для загрузки аватара.
Comments
А зачем отдельная модель для аватара?
А чтоб через админку грузить можно было :) Предлагаешь сделать новое поле в модели User или просто по ID пользователя грузить?
av = UserAvatar.objects.get(user=self) if not av is None: av.delete()
Здесь разве не User.DoesNotExist надо ловить?
Comment form for «Аватары для Django-проекта»