Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 26, 2011 10:41:58

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

создание миниатюр. sorl-thumbnail.

Есть модуль models.py и в нем модель Book:

from django.db import models
from sorl.thumbnail import ImageField
from sorl.thumbnail.shortcuts import get_thumbnail
from sorl.thumbnail import delete
import settings
import os

class Book(models.Model):
......................................................
title = models.CharField(u'название', max_length=50)
cover = ImageField(upload_to='img/covers/', blank=True, null=True, verbose_name=u'обложка')

def small_cover(self):
if self.cover:
resize_cover = get_thumbnail(self.cover, '60x80', crop='center', quality=99)
html = '<a href="%s%s"><img src="%s" title="%s" /></a>'
return html % (settings.MEDIA_URL, self.cover, resize_cover.url, self.title)
else:
return u'отсутствует'
small_cover.short_description = u'миниатюра'
small_cover.allow_tags = True

def save(self):
try:
old_cover = Book.objects.get(id=self.id)
except Book.DoesNotExist:
pass
else:
if old_cover.cover and old_cover.cover != self.cover:
path_cover = os.path.join(settings.MEDIA_ROOT, '%s') % old_cover.cover
#path_small_cover = os.path.join(settings.MEDIA_ROOT, '%s') % resize_cover.url
if os.path.exists(path_cover):
delete(old_cover.cover)
#if os.path.exists(path_small_cover):
#delete(resize_cover.url)
super(Book, self).save()
Так вот методом small_cover создаю миниатюры, которые sorl-thumbnail ложит в папку cache в MEDIA_ROOT.
А вот допустим когда я хочу изменить обложку, то надо сначала удалить старый оригинал и его миниатюру. Для этого я переопределил метод save(). Он без проблем удаляет оригинал. А вот как грамотно получить url миниатюры resize_cover.url из метода small_cover не догоняю.
Вопросы возникли следующие:
1) Нормально ли использовать html прямо в методе small_cover? Если нет, то как нужно делать правильно?
2) Правильно ли я делаю удаление старых файлов? или есть другой способ?
3) Как удалить миниатюру? т.е как достучаться до ее url(resize_cover.url)?



Офлайн

#2 Авг. 26, 2011 11:34:58

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2267
Репутация: +  41  -
Профиль   Отправить e-mail  

создание миниатюр. sorl-thumbnail.

1) в данном случае нормально, правда return u'отсутствует' … я б всё-таки None возвращал, а уже в шаблоне выводил |default:'отсутствует'
2) self.cover.delete() не работает? этот момент в джанге не раз меняли могу ошибаться, если у тебя дефолтный сторедж. то https://code.djangoproject.com/browser/django/trunk/django/core/files/storage.py#L219 (но вроде я прав ;]) + в коде сорла
3) https://github.com/sorl/sorl-thumbnail/blob/master/sorl/thumbnail/fields.py#L13 похоже всё должно удаляться

Офлайн

#3 Авг. 26, 2011 13:39:28

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

создание миниатюр. sorl-thumbnail.

slav0nic
1) в данном случае нормально, правда return u'отсутствует' … я б всё-таки None возвращал, а уже в шаблоне выводил |default:'отсутствует'
2) self.cover.delete() не работает? этот момент в джанге не раз меняли могу ошибаться, если у тебя дефолтный сторедж. то https://code.djangoproject.com/browser/django/trunk/django/core/files/storage.py#L219 (но вроде я прав ;]) + в коде сорла
3) https://github.com/sorl/sorl-thumbnail/blob/master/sorl/thumbnail/fields.py#L13 похоже всё должно удаляться
1) сделал так:
    def small_cover(self):
if self.cover:
resize_cover = get_thumbnail(self.cover, '60x80', crop='center', quality=99)
html = '<a href="%s%s"><img src="%s" title="%s" /></a>'
return html % (settings.MEDIA_URL, self.cover, resize_cover.url, self.title)
а уже в шаблоне выводил |default:'отсутствует'
В шаблоне я понял как это будет работать.
А если я использую эту функцию чтобы выводить миниатюры в админке, т.е:
class BookAdmin(admin.ModelAdmin):
list_display = ('title', 'small_cover', )
то как мне вместо None прибабахать u'отсутствует'?

3) Вы правы все действительно удаляется. мда …. куда смотрел, не понятно(. Поглядел еще в доках тут и + вашу ссылку и более менее понял.
В общем вот так вот действительно все работает:
    def save(self):
try:
old_cover = Book.objects.get(id=self.id)
except Book.DoesNotExist:
pass
else:
if old_cover.cover and old_cover.cover != self.cover:
path_cover = os.path.join(settings.MEDIA_ROOT, '%s') % old_cover.cover
if os.path.exists(path_cover):
delete(old_cover.cover)
super(Book, self).save()
Но только вопрос появился следующий:
Все это дело отрабатывает на ура, но старые каталоги где лежали миниатюры остаются в той же папке cache (т.е они пустые) как с этим бороться?



Офлайн

#4 Авг. 26, 2011 14:56:04

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2267
Репутация: +  41  -
Профиль   Отправить e-mail  

создание миниатюр. sorl-thumbnail.

намёк https://github.com/sorl/sorl-thumbnail/blob/master/sorl/thumbnail/management/commands/thumbnail.py
использовать key value store?) или написать свою команду, в принципе если вы удалите что-то из кеша, ничего страшного не случится, можно раз в месяц перестраивать кеш например, если у вас конечно не дохера+1 этих картинок

или опять же напишите команду которая дропает empty каталоги

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version