我有一个演示Wagtail网站。通过Cookiecutter生成网站。要使用初始内容填充CMS,我添加了load_initial_data
命令,可以在安装Wagtail后运行。这将从fixture的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 }}" />
仍然会返回损坏的图像,并且不会像我预期的那样将图像从original_images
文件夹处理到images
文件夹。我在初始数据加载后试过这个,并且假设这是因为图像大小需要在数据库和模板中都有引用?
有没有办法以编程方式强制Wagtail重新处理所有图像以生成图像管理页面正在查找的大小和文件名?
(快速提及,如果相关的话,图片当前位于项目仓库内,但最终将是存储在云存储中的zip文件,只有在请求时才会导入到项目中。目前,无论是否用户是否想要它们,图像包含在Cookiecutter中
答案 0 :(得分:1)
每当模板(前端或管理员内)需要特定大小的图像时,它将在wagtailimages.Rendition
模型(或项目特定的Rendition模型,如果自定义图像模型位于使用)看看以前是否已生成一个。如果是这样,它将使用现有文件;如果没有,它将生成一个新的并添加一个Rendition记录。
如果您的图像损坏,很可能意味着存在Rendition记录(因为它已包含在您的初始数据夹具中),但相应的图像文件不存在于MEDIA_ROOT /图像。正确的解决方法是从夹具中删除再现记录。要在事后修复此问题并强制重新创建所有图像再现,您只需删除wagtailimages_rendition
表的内容。