Wagtail 模拟图像在管理中显示为损坏但在模板上可见

Wagtail mock images show as broken in admin but visible on template

我有一个演示 Wagtail 网站。站点是通过 Cookiecutter 生成的。为了用初始内容填充 CMS,我添加了一个 load_initial_data 命令,一旦安装了 Wagtail,它就可以是 运行。这会从 fixtures JSON 文件填充文本内容,并将图像从 fixtures 文件夹移动到 Wagtail 站点的 media_root 文件夹。代码如下:

# 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 }}" />

仍然是 returns 损坏的图像,并且没有像我预期的那样将图像从 original_images 文件夹处理到 images 文件夹。我在初始数据加载后试过这个,我假设这是因为图像大小需要在数据库和模板中都有参考?

有没有办法以编程方式强制 Wagtail 重新处理所有图像以生成图像管理页面正在寻找的大小和文件名?

(快速提及,如果相关的话,图像当前位于项目回购中,但最终将是存储在云存储中的 zip 文件,只有在请求时才会导入到项目中。目前,无论无论用户是否需要,图像都包含在 Cookiecutter 中)

每当模板(front-end 或在管理员中)需要特定尺寸的图像时,它将在 wagtailimages.Rendition 模型(或 project-specific 再现模型,如果正在使用自定义图像模型)以查看以前是否生成过一个模型。如果是这样,它将使用现有文件;如果没有,它将生成一个新的并添加一个 Rendition 记录。

如果您得到损坏的图像,很可能意味着存在再现记录(因为它已包含在您的初始数据夹具中)但相应的图像文件不存在于 MEDIA_ROOT/images 中。正确的解决方法是从您的设备中删除再现记录。要在事后解决此问题并强制重新创建所有图像演绎版,您只需删除 wagtailimages_rendition table.

的内容即可