2017-01-20 4 views
0

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

# 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, как я и ожидал. Я попробовал это после начальной загрузки данных, и предполагаю, что это связано с тем, что размер изображения должен иметь ссылку как в базе данных, так и в шаблоне?

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

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

ответ

1

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

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

+0

Спасибо Гасман. Удаление какой-либо ссылки на модель wagtailimages.rendition в файлах JSON устраняет проблему. Благодаря! – heymonkeyriot