2

オプションの写真フィールドを持つモデルがあります。写真を追加すると、自動的にサムネイルが作成されて保存されるようにしたい。しかし、pre_save 信号でこれを行うと IOError が発生し続け、post_save 信号でこれを実行しようとすると、無限の post_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)
4

1 に答える 1

2

私はそれを考え出した。私が抱えていた問題は、サムネイル フィールドを保存しようとすることでした。シグナル内でそれを実行しようとしていました。そのため、代わりにモデルの save() 関数にサムネイル フィールドを保存し、信号を残してサムネイルを作成することを修正します。

理解するのに少し時間がかかりました:/

于 2010-08-13T20:26:02.920 に答える