Django - сохранение изображения вручную в поле ImageField - PullRequest
10 голосов
/ 25 октября 2011

Следующий код берет изображение после его сохранения и делает из него эскиз:

class Image(models.Model):
    image     = models.ImageField(upload_to='images')
    thumbnail = models.ImageField(upload_to='images/thumbnails', editable=False)

    def save(self, *args, **kwargs):
       super(Image, self).save(*args, **kwargs)
       if self.image:
           from PIL import Image as ImageObj
           from cStringIO import StringIO
           from django.core.files.uploadedfile import SimpleUploadedFile

           try:
               # thumbnail
               THUMBNAIL_SIZE = (160, 160)  # dimensions

               image = ImageObj.open(self.image)

               # Convert to RGB if necessary
               if image.mode not in ('L', 'RGB'): image = image.convert('RGB')

               # create a thumbnail + use antialiasing for a smoother thumbnail
               image.thumbnail(THUMBNAIL_SIZE, ImageObj.ANTIALIAS)

               # fetch image into memory
               temp_handle = StringIO()
               image.save(temp_handle, 'png')
               temp_handle.seek(0)

               # save it
               file_name, file_ext = os.path.splitext(self.image.name.rpartition('/')[-1])
               suf = SimpleUploadedFile(file_name + file_ext, temp_handle.read(), content_type='image/png')

               self.thumbnail.save(file_name + '.png', suf, save=False)
           except ImportError:
               pass

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

Единственная проблема заключается в том, что миниатюре не назначается путь для вновь созданного миниатюры - она ​​пуста в базе данных.Я прочитал документацию, и похоже, что если я сохраню миниатюру с помощью команды save = True, это должно решить мою проблему:

self.thumbnail.save(file_name + '.png', suf, save=True)

Однако при этом возникает следующее:

Django Version: 1.3.1
Exception Type: IOError
Exception Value:    
cannot identify image file

Я не могу понять, что я делаю неправильно.

Ответы [ 2 ]

6 голосов
/ 05 ноября 2011

Я решил свою проблему, просто переместив:

super(Image, self).save(*args, **kwargs)

в конец def save ().Я до сих пор не уверен, почему так происходит, но единственное объяснение состоит в том, что сама save () сохраняет значения полей в базе данных и, следовательно, должна выполняться в самом конце.

2 голосов
/ 27 октября 2011

Попробуйте передать фактическое содержимое файла вместо объекта SimpleUploadedFile:

self.thumbnail.save(file_name + '.png', temp_handle.read(), save=True)

https://docs.djangoproject.com/en/dev/ref/files/file/#additional-methods-on-files-attached-to-objects как вручную назначить поле изображения в Django Программное сохранение изображения в Django ImageField

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...