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.
的内容即可
我有一个演示 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.