Задать вопрос
@mrkovalchuk
Junior developer

Как сохранить изображение в ImageField django?

Доброго времени суток.

Имею проблему с сохранением картинок. Мыслю так: получаем картинку, рисуем ей путь, записываем write-ом, переоткрываем файл, присваиваем полю файл, сохраняем.

Звучит интересно, и даже работает, но с одной поправкой: сохранят два изображения. Как этого избежать?

FragmentCode.py
news = NewsItem(**item)
        r = requests.get(news['image'])
        image_path = MEDIA_ROOT + 'news_image/' + path.basename(urlparse(news['image']).path)

        with open(image_path, 'wb') as f:
            f.write(r.content)

        reopen = open(image_path, 'rb')
        django_file = File(reopen)
        news['image'] = django_file
  • Вопрос задан
  • 1580 просмотров
Подписаться 1 Оценить 4 комментария
Решения вопроса 1
un1t
@un1t
Ну ты его один раз через write сохраняешь, а второй раз он сохраняется видимо когда ты модель сохраняешь.

NewsItem это модель или что?

А тебе не нужно его самостоятельно на диск сохранять.

buf = BytesIO()
buf.write(r.content)
# obj это инстанс модели
obj.image = File(buf)
obj.save()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@mrkovalchuk Автор вопроса
Junior developer
Итак, подытожим. Рабочий вариант:

news = NewsItem(**item)
        r = requests.get(news['image'])
        image = path.basename(urlparse(news['image']).path)
        buf = BytesIO()
        buf.write(r.content)

        news['image'] = File(buf, image)


Получаем респонс, извлекаем имя изображения, создаем BytesIO объект, извлекаем контент и пишем его в буф, потом берем наш объект (scrapy item, созданный с помощью django-item) и приводим его к нужному формату, передавая буф и название. Потом просто сохраняем итем\объект news.save()

Т.е. нам не хватало имя для файла
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы