Django тег static_webp конвертера webp не работает - PullRequest
0 голосов
/ 16 июня 2020

Я установил пакет webp_converter по адресу Здесь

{% load webp_converter %}

This is not working which I want to add static_webp
<img src="{% static_webp 'modelImage.url' %}">

This is working fine
<img src="{{ modelImage.url }}">

From Official Doc says
<img src="{% static_webp 'img/hello.jpg' %}">

1 Ответ

1 голос
/ 20 августа 2020

Мне не удалось настроить вывод в шаблон с помощью {% static_webp 'modelImage.url' %}. Но я смог преобразовать файл при загрузке и сразу сохранить файлы в желаемом формате (webp). Мое решение может быть полезно для тех, кто разрабатывает новый проект, потому что мой метод не предполагает ранее сохраненных файлов в модели. Итак, начнем по порядку.

  1. models.py В моей модели (Каталоге) я переопределил путь к месту хранения изображений, вызвав функцию (rename_file). Функция (rename_file) переименовывает расширение нашего файла в .webp, создавая правильный obj.url. Это нужно сделать немедленно. Потому что obj.url имеет атрибут только для чтения.

    from django.db import models
    from datetime import date
    
    image_path = os.path.abspath(settings.MEDIA_ROOT + '/photos/asics/' + date.today().strftime('%Y/%m/%d/'))
    
    def rename_file(instance, filename):
        if filename.find('.') >= 0:
            dot_index = (len(filename) - filename.rfind('.', 1)) * (-1)
            filename = filename[0:dot_index]
        filename = '{}.{}'.format(filename, 'webp')
        return os.path.join(image_path, filename)
    
    class Catalog(models.Model):
        photo = models.ImageField(upload_to=rename_file, blank=True)
    
  2. admin.py Изображения добавляются в мое приложение через панель администратора. Поэтому я решил преобразовать изображения в этом файле, но это не имеет значения. Здесь я использую сигналы (post_save) для вызова функции (convert_image), которая преобразует изображение в желаемый формат (.webp) и заменяет файл Origanal новым файлом.

     from django.contrib import admin
     from .models import Catalog
     from PIL import Image
     from django.db.models.signals import post_save
    
     @receiver(post_save, sender=Catalog)
     def convert_image(instance, **kwargs):
         if image_name:
             im = Image.open(image_name).convert('RGB')
             output_path = str(image_name)
             im.save(output_path, 'webp')
    
      class CatalogAdmin(admin.ModelAdmin):
          def save_model(self, request, obj, form, change):
              global image_name
              image_name = obj.photo
              super().save_model(request, obj, form, change)
    
...