Программное сохранение изображения в Django ImageField создает бесконечный цикл изображений - PullRequest
2 голосов
/ 15 ноября 2009

У меня есть метод save для модели, которая выглядит так:

def save(self, force_insert=False, force_update=False):
    img_url = "http://example.com/%s.jpg" % (self.title)
    name = urlparse(img_url).path.split('/')[-1]
    content = urllib.urlretrieve(img_url)
    self.image.save(name, File(open(content[0])), save=True)
    super(Test, self).save(force_insert, force_update)    

По какой-то причине это создает бесконечный цикл создания изображений с еще большим числом _ в имени файла. Наконец, я понял, что это происходит, когда я получил ошибку Django, в которой говорилось, что в файле, который он пытался сохранить, было слишком много символов (я нашел 242 сохраненных изображения).

Я пытался использовать информацию из этого вопроса .

Есть идеи, что здесь происходит?

Ответы [ 2 ]

4 голосов
/ 15 ноября 2009

Я думаю, что при просмотре исходного кода вызов ImageFileField.save() (на самом деле FileField.save() из-за наследования) приводит к обновлению экземпляра (а именно строки БД), в котором хранится имя файла.

Это означает, что в вашем save методе вы вызываете ImageFileField.save(), который, в свою очередь, вызывает ваш метод сохранения, вызывая рекурсию.

Если вы хотите предотвратить это, прочитав исходный код, просто передайте save=False в self.image.save. Это сохранит данные файла на диск, но просто не будет save данные экземпляра (строка БД). Однако в следующей строке вы сохраняете его, вызывая суперкласс, поэтому я думаю, что он будет сохранен в базе данных.

На самом деле похоже, что save=False в методе save был разработан, чтобы помочь в этом случае!

0 голосов
/ 15 ноября 2009

Я не уверен на 100%, но может случиться так, что при вызове self.image.save по умолчанию также вызывается метод сохранения модели - таким образом создается бесконечный цикл. Я не проверял это, но я видел, что это происходит.

Мое предложение, если в этом проблема: отправьте сигнал из метода сохранения моделей, содержащего этот экземпляр, а затем используйте отдельную функцию для загрузки / анализа изображения и его сохранения.

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