2010-09-08 14 views
1

Я пытаюсь изменить размер изображения до его сохранения. Я использую пользовательский метод сохранения на модели, но я попал в ловушку.модель save способ. Изменение размера изображения перед сохранением

Это код, у меня сейчас:

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) 

Это терпит неудачу, и говорит мне, что файл не может быть найден. Насколько я могу судить, это связано с тем, что изображение пока существует только в памяти и поэтому не может быть открыто так.

Итак, мой вопрос: как я открываю изображение из памяти и сохраняю его обратно в память, поэтому метод сохранения по умолчанию может справиться с этим?

Большое спасибо за любую помощь, это сводит меня вверх по стене :)

ответ

1

Вам нужно так сохранить ваши UserImages, прежде чем пытаться получить доступ к его ImageField.

пример, как это сделать, можно найти в этом фрагменте:

В основном:

super(UserImages, self).save() 

PS. Модель должна иметь уникальное имя, например. UserImage вместо UserImages.

+0

Большое спасибо. Сначала подумал о спасении, но потом забыл об этом. Не знаю, почему. И спасибо за хэдпокс по имени. Я продолжаю называть все мои модели во множественном числе, этот, должно быть, проскользнул через последнюю проверку :) –

1

Использование Джанго-изменения размера

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') 

Для получения дополнительной информации на вид https://github.com/un1t/django-resized

+0

это, кажется, разбивает загрузку файла для меня – max4ever

Смежные вопросы