Изменение изображения после его сохранения с помощью ImageField

Я совершенно не понимаю, как мне изменить изображение после его сохранения. У меня есть модель:

class Pic(models.Model):
    imgfile = FaceChopField(upload_to='img/%m/%d')

Изображение загружается нормально. Я просмотрел этот вопрос кучу, и я нашел несколько фрагментов и подобных вопросов, но я все еще ужасно запутался. Да, я провел кучу поисков, касающихся именно этой путаницы/проблемы.

Могу ли я просто:

  1. Получите доступ к сохраненному каталогу изображений.
  2. Найдите загруженное изображение по имени/каталогу.
  3. Запустите мой mod_image(имя файла) на изображении.
  4. Сохраните измененное изображение в другом каталоге.

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


Вот моя текущая попытка:

class FaceChopFieldFile(ImageFieldFile):
    def __init__(self, *args, **kwargs):
        super(FaceChopFieldFile, self).__init__(*args, **kwargs)

    def save(self):
        super(FaceChopFieldFile, self).save()
        image_content = facechop(self.path) #my image modification function

        self.storage.save(self.path, image_content)


class FaceChopField(ImageField):
    attr_class = FaceChopFieldFile    


class Pic(models.Model): 
    imgfile =  FaceChopField(upload_to='img/%m/%d')

Ничего плохого?


person Mr_Spock    schedule 04.06.2013    source источник
comment
Вот пример изменения размера изображения после сохранения: djangosnippets.org/snippets/1100   -  person Timmy O'Mahony    schedule 04.06.2013


Ответы (2)


Что вам действительно нужно, так это хук, который вызывается, когда объект вот-вот будет сохранен в БД. Что бы я сделал, так это иметь всю логику обработки изображений внутри функции, которая переопределяет save метод вашей модели. Однако это замедлит работу пользователей вашего сайта. В такой ситуации я бы порекомендовал написать задачу celery. Еще лучше вы можете запускать периодическую задачу.

person Sidharth Shah    schedule 04.06.2013
comment
Мне это совсем не помогает, извините. - person Mr_Spock; 04.06.2013

Я исправил свою проблему. Оказалось, что я неправильно переопределял save():

class FaceChopFieldFile(ImageFieldFile):
    def __init__(self, *args, **kwargs):
        super(FaceChopFieldFile, self).__init__(*args, **kwargs)

    def save(self, name, content, save=True):
        super(FaceChopFieldFile, self).save(name, content, save)
        image_content = facechop(self.path) #my image modification function

        self.storage.save(self.path, image_content)


class FaceChopField(ImageField):
    attr_class = FaceChopFieldFile



class Pic(models.Model): 
    imgfile =  FaceChopField(upload_to='img/%m/%d')

Проблема заключалась в следующем:

def save(self):
    super(FaceChopFieldFile, self).save()

Поэтому я изменил его на:

def save(self, name, content, save=True):
            super(FaceChopFieldFile, self).save(name, content, save)

Он делает именно то, что я хочу, чтобы он делал сейчас.

person Mr_Spock    schedule 05.06.2013