Макетные изображения трясогузки отображаются как неработающие в админке, но видны в шаблоне

У меня есть демо-сайт трясогузки. Сайт создается с помощью Cookiecutter. Чтобы заполнить CMS исходным контентом, я добавил команду load_initial_data, которую можно запустить после установки Wagtail. Это заполняет текстовое содержимое из JSON-файла приспособлений и перемещает изображения из папки приспособлений в папку media_root сайта Wagtail. Код выглядит так:

# load_initial_data.py
import os, shutil

from django.conf import settings
from django.core.management.base import BaseCommand
from django.core.management import call_command


class Command(BaseCommand):
    def handle(self, **options):
        fixtures_dir = os.path.join(settings.PROJECT_DIR, 'fixtures')
        fixture_file = os.path.join(fixtures_dir, 'db.json')
        image_src_dir = os.path.join(fixtures_dir, 'images')
        image_dest_dir = os.path.join(settings.MEDIA_ROOT, 'original_images')

        call_command('loaddata', fixture_file, verbosity=0)

        if not os.path.isdir(image_dest_dir):
            os.makedirs(image_dest_dir)

        for filename in os.listdir(image_src_dir):
            shutil.copy(os.path.join(image_src_dir, filename), image_dest_dir)

Это работает до тех пор, пока изображения копируются в правильный каталог, а в шаблонах изображения появляются, как и ожидалось, по запросу. Проблема заключается в /admin/images/, где запрошенная версия изображения недоступна, и поэтому браузер показывает иконку неработающего изображения.

Страница администратора ищет определенный размер изображения ({your-image-name}.max-165x165.{.jpg|.png|.gif}.

Наблюдение за тем, как изображения перемещаются из original_images в images, создает впечатление, что они обрабатываются только после первого запроса шаблона, в котором они находятся. Одной из идей может быть создание шаблона со списком всех изображений (с правильным стилем) для их обработки после загрузки данных. Однако сделать что-то вроде

{% image page.image max-165x165 as test_photo %}
    <img src="{{ test_photo.url }}" width="{{ test_photo.width }}" height="{{ test_photo.height }}" alt="{{ test_photo.alt }}" />

По-прежнему возвращает поврежденное изображение и не обрабатывает изображение из папки original_images в папку images, как я ожидал. Я попробовал это после начальной загрузки данных и предполагаю, что это потому, что размер изображения должен иметь ссылку как в базе данных, так и в шаблоне?

Есть ли способ программно заставить трясогузку повторно обрабатывать все изображения, чтобы сгенерировать размер и имя файла, которые ищет страница администратора изображения?

(Чтобы быстро упомянуть, если это уместно, изображения в настоящее время находятся в репозитории проекта, но в конечном итоге будут zip-файлом, хранящимся в облачном хранилище, и будут импортированы в проект только после запроса. В настоящее время, независимо от того, хочет ли пользователь их или нет, изображения включены в Cookiecutter)


person heymonkeyriot    schedule 20.01.2017    source источник


Ответы (1)


Всякий раз, когда шаблону (интерфейсному или административному) требуется изображение определенного размера, он просматривает модель wagtailimages.Rendition (или модель представления для конкретного проекта, если используются пользовательские модели изображений), чтобы увидеть, есть ли у него ранее были сгенерированы. Если это так, он будет использовать существующий файл; если нет, он создаст новый и добавит запись представления.

Если вы получаете поврежденное изображение, это, скорее всего, означает, что запись представления существует (поскольку она была включена в исходную фикстуру данных), но соответствующий файл изображения отсутствует в MEDIA_ROOT/images. Правильным решением было бы удалить записи воспроизведения из вашего прибора. Чтобы исправить это постфактум и принудительно воссоздать все представления изображений, вы можете просто удалить содержимое таблицы wagtailimages_rendition.

person gasman    schedule 20.01.2017
comment
Спасибо Газман. Удаление любой ссылки на модель wagtailimages.rendition в файле JSON приспособлений устранило проблему. Спасибо! - person heymonkeyriot; 21.01.2017