У меня есть веб-скребок, который я хочу загрузить изображение страницы, которое он соскабливает, и сохранить его как «скриншот» ImageField в модели Django. Я использую этот код:Сохранение BytesIO на Django ImageField
def save_screenshot(source,screenshot):
box = (0, 0, 1200, 600)
im = Image.open(io.BytesIO(screenshot))
region = im.crop(box)
tempfile_io = io.BytesIO()
region.save(tempfile_io, 'JPEG', optimize=True, quality=70)
source.screenshot.save(source.slug_name+"-screenshot",ContentFile(tempfile_io.getvalue()),save=True)
Он сохраняет скриншот к/СМИ/news_source_screenshots/директории, но не сохраняет его в модели. Поле модели определено как:
screenshot = models.ImageField(upload_to='news_source_screenshots',blank=True,null=True)
Что мне не хватает?
Я вижу, что вы сохраняете файл tempfile без данных, вы должны сохранить 'region' ... в' source.screenshot.save (source.slug_name + "- screenshot", ContentFile (region.get_value()) , save = True) ', помните, что регион os теперь ваш tempfile, потому что tempfile_io является void-буфером –
спасибо @ german-alzate-martinez, но когда я попытался исправить, я получил:' code' TypeError: 'Image' не поддерживает буферный интерфейс 'code', и изображение больше не сохраняется в каталоге/media/news_source_screenshost/ –
Попробуйте изменить буфер на строку io, какой регион возврата? –