2010-08-13 29 views
2

J'ai un modèle qui a une option photo. Quand une photo est ajoutée, je veux qu'une vignette soit automatiquement créée et stockée. Cependant, quand je fais ceci avec un signal pre_save, je continue à recevoir une IOError, et si j'essaye de le faire avec un signal post_save, je ne peux pas enregistrer le chemin des miniatures vers mon modèle sans créer et boucle post_save infinie.Obtenir IOError lors de l'utilisation du signal pre_save pour stocker une vignette

est ici le code

# 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

Post le retraçage aussi s'il vous plaît. –

+0

Êtes-vous sûr que 'instance.photo.path' est valide avant que' save() 'soit fait? Qu'Est-ce que c'est? Un fichier existe-t-il sur ce chemin? –

Répondre

2

I figured it out. Le problème que j'éprouvais était d'essayer de sauvegarder le champ des vignettes, et j'essayais de le faire dans un signal. Donc, pour corriger cela, je sauve le champ thumbnail dans la fonction save() à la place, et laisse le signal pour créer la vignette.

Il m'a juste fallu un certain temps pour comprendre:/

+0

Hmm, avez-vous envisagé d'utiliser quelque chose comme [django-photologue] (http://code.google.com/p/django-photologue/)? –