2015-01-09 2 views
0

Я переопределяю свой метод сохранения, потому что хочу изменить размер изображения. Моя проблема очевидна в этом коде, что происходит после сохранения моих данных в том, что django запускает бесконечный цикл. Конечно, это потому, что я проверяю, установлен ли self.vertical или нет (и всегда установлен). Метод Save всегда называется.Изменение размера и обновление изображения в Django

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

Я также попытался ввести ложный аргумент в kwargs и после сохранения, установить true, но также не работал. У кого-то есть идея, как я могу это решить?

PS: get_thumbnail - это способ создания миниатюрного плагина sorl.

def save(self, *args, **kwargs): 
     if self.vertical_poster: 
      super(Movie, self).save(*args, **kwargs) 

      resized_vertical = get_thumbnail(self.vertical_poster, "155x240", quality=99)    

      #save the new resized file    
      self.vertical_poster.save(resized_vertical.name, ContentFile(resized_vertical.read()), True) 

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

Любая идея или образец кода будут оценены! Thanks

ответ

0

Мое решение не сведете сохранить метод. Я сделал что-то другое:

Я решил использовать «django-resized». Этот плагин совместит с «sorl-миниатюрой» масштабируется и изображения происхождения указанного размера на поле модели, как показано ниже:

from django_resized import ResizedImageField 

class Movie(models.Model): 

    .... 

    vertical_poster = ResizedImageField(upload_to="movies", width=155, height=240) 

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

Ссылка: https://github.com/un1t/django-resized

0

Вы можете проверить изображение, не доступно ли оно в ваших желаемых размерах. Я думаю, что вы можете использовать https://pypi.python.org/pypi/dimensions, чтобы сделать его простым

def save(self, *args, **kwargs): 
    if self.vertical_poster: 
     import dimensions 

     # Set desired dimensions 
     width = 155 
     height = 240 

     image_info = dimensions.dimensions(self.vertical_poster) 

     if image_info[0] != width and image_info[1] != height: 
      dimension = '%dx%d' % (width, height) 
      resized_vertical = get_thumbnail(self.vertical_poster, dimension, quality=99)    

      #save the new resized file    
      self.vertical_poster.save(resized_vertical.name, ContentFile(resized_vertical.read()), True) 
    super(Movie, self).save(*args, **kwargs) 

Надеется, что это помогает.

+0

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

+0

Я вижу, так где именно вы получаете размеры для изменения размера? –

0

Если вы используете ImageField вы можете сделать это следующим образом:

def save(self, *args, **kwargs): 
    if self.vertical_poster.x != 155 or self.vertical_poster.y != 240: 
     resized_vertical = get_thumbnail(self.vertical_poster, "155x240", quality=99)    

     # save the new resized file    
     self.vertical_poster.save(resized_vertical.name, ContentFile(resized_vertical.read()), True) 

    super(Movie, self).save(*args, **kwargs) 
+0

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

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