2010-09-08 4 views
1

J'essaye de redimensionner une image avant qu'elle ne soit enregistrée. J'utilise une méthode de sauvegarde personnalisée sur le modèle, mais j'ai rencontré un problème.méthode de sauvegarde du modèle. Redimensionner l'image avant d'enregistrer

C'est le code que j'ai maintenant:

class UserImages(models.Model): 
    height = models.CharField(blank=True, max_length=100) 
    width = models.CharField(blank=True, max_length=100) 
    image = models.ImageField(upload_to="UserImages/%Y/%m/%d", height_field='height', width_field='width') 
    owner = models.ForeignKey(User) 

    def __unicode__(self): 
     return str(self.image) 
    def save(self, *args, **kwargs): 
     if self.image: 
      filename = str(self.image.path) 
      img = Image.open(filename) 

      if img.mode not in ('L', 'RGB'): 
       img = img.convert('RGB') 

      img = ImageOps.fit(img, (180,240), Image.ANTIALIAS, 0, (0.5, 0.5)) 
      img.save(self.image.path) 
     super(UserImages, self).save(*args, **kwargs) 

Cela ne me dit que le fichier ne peut être trouvé. Pour autant que je sache, cela a à voir avec le fait que l'image n'existe que dans la mémoire et ne peut donc pas être ouverte comme ça. Donc, ma question est: Comment puis-je ouvrir l'image de la mémoire et l'enregistrer en mémoire afin que la méthode de sauvegarde par défaut peut faire son truc avec elle?

Un grand merci pour toute aide, cela me conduit le mur :)

Répondre

1

Vous aurez besoin donc enregistrer votre UserImages avant d'essayer d'accéder à son ImageField.

Un exemple comment faire cela se trouve dans cet extrait:

En gros:

super(UserImages, self).save() 

PS. Votre modèle doit avoir un nom unique, par ex. UserImage au lieu de UserImages.

+0

Un grand merci. Je pensais à épargner d'abord, mais je l'ai encore oublié. Aucune idée pourquoi. Et merci pour le headsup sur le nom. Je continue à nommer tous mes modèles au pluriel, celui-ci doit avoir glissé à travers le dernier contrôle :) –

1

utilisation django-redimensionnées

pip install django-resized 

models.py

from django_resized import ResizedImageField 

class MyModel(models.Model): 
    ... 
    image = ResizedImageField(max_width=500, max_height=300, upload_to='whatever') 

Pour plus d'informations consultez https://github.com/un1t/django-resized

+0

cela semble briser le téléchargement de fichiers pour moi – max4ever

Questions connexes