Невозможно сохранить webp-файл в поле модели

Я не уверен, что это полностью связано с django, но если кто-то может мне помочь, я был бы очень признателен! У меня проблемы с генерацией webp файла из следующего кода

from io import BytesIO
from PIL import Image
import requests

У меня есть следующая модель

class UserImage(models.Model):     
     user_provided_image = VersatileImageField(upload_to=folder10, null=True, blank=True)     
  nextgen_image = models.FileField(upload_to=folder10,null=True, blank=True) #for WebP images 

Я создаю webp-файл. Этот код работает, но он сохраняет его в файл в корневой каталог моего проекта, и я не уверен, как сохранить его в поле FileField (т.е. nextgen_image ) на моей модели

def create_webp_image(sender, instance, *args, **kwargs):

    image_url = instance.image.thumbnail['1920x1080'].url    

    try:
        response = requests.get(image_url, stream=True)
        path = image_url

    except: #local env
        path = "http://localhost:8000" + image_url
        response = requests.get(path, stream=True)

    img = Image.open(BytesIO(response.content))

    #build file path
    position = path.rfind("/") + 1
    newpath = path[0:position]
        
    #build file name
    image_name = path[position:]
    name_of_file = image_name.split('.')[0] + ".webp"
       
    #this creates the webp file
    img.save(name_of_file,"webp")

    #save image to model
    #instance.nextgen_image = ?

post_save.connect(create_webp_image, sender=UserImage)

Спасибо!

Если вы хотите использовать пакеты для выполнения работы, то используйте этот пакет django-resized.

Основываясь на приведенном выше коде, это должно помочь. Надеюсь, это решит вашу проблему. Будьте здоровы

nextgen_image = ResizedImageField(force_format="WEBP", 
upload_to=folder10,null=True, blank=True)

Вы можете использовать что-то вроде этого:

from django.core.files.base import ContentFile

...
img_content = ContentFile(BytesIO(response.content))
instance.nextgen_image.save(name_of_file, img_content, save=True)
...
Вернуться на верх