метод сохранения модели.Изменить размер изображения перед сохранением - PullRequest
1 голос
/ 08 сентября 2010

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

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

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)

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

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

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

Ответы [ 2 ]

1 голос
/ 21 августа 2012

Использовать django-resized

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

1 голос
/ 08 сентября 2010

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

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

В основном:

super(UserImages, self).save()

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

...