2010-08-13 1 views
2

У меня есть модель, у которой есть опция photo. Когда добавляется фотография, я хочу, чтобы миниатюра автоматически создавалась и сохранялась. Однако, когда я делаю это с сигналом pre_save, я продолжаю получать IOError, и если я попытаюсь сделать это с помощью сигнала post_save, я не смогу сохранить путь эскизов к моей модели без создания и бесконечного цикла post_save.Получение IOError при использовании сигнала pre_save для сохранения миниатюры

Вот код

# using PIL 
from PIL import Image 
import os 
... 

# my model 
class Course(models.Model): 
    ... 
    photo = models.ImageField(upload_to='course_images/', blank=True, null=True) 
    thumbnail = models.ImageField(upload_to='course_images/thumbnails/', blank=True, null=True, editable=False) 
    ... 

# my pre_save signal 
def resize_image(sender, instance, *args, **kwargs): 
    '''Creates a 125x125 thumbnail for the photo in instance.photo''' 
    if instance.photo: 
     image = Image.open(instance.photo.path) 
     image.thumbnail((125, 125), Image.ANTIALIAS) 
     (head, tail) = os.path.split(instance.photo.path) 
     (a, b) = os.path.split(instance.photo.name) 
     image.save(head + '/thumbnails/' + tail) 
     instance.thumbnail = a + '/thumbnails/' + b 

models.signals.pre_save.connect(resize_image, sender=Course) 
+0

Опубликовать трассировку тоже пожалуйста. –

+0

Вы уверены, что 'instance.photo.path' действителен до' save() 'is done? Что это? Существует ли файл на этом пути? –

ответ

2

Я понял это. Проблема, с которой я столкнулась, заключалась в том, чтобы сохранить поле миниатюр, и я пытался сделать это в сигнале. Поэтому, чтобы исправить это, я сохраняю поле миниатюр в функции save() моделей и оставляю сигнал для создания миниатюры.

Как-то подумал:/

+0

Хм, вы считали, что используете что-то вроде [django-photologue] (http://code.google.com/p/django-photologue/)? –