You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Wagtail中通过代码创建带StreamField的测试页面?

测试Wagtail带StreamField页面的代码创建方法

我在测试Wagtail页面时,创建无StreamField的页面可以正常工作,代码如下:

blogPage = BlogPage(title="Test Blog",path="test-blog", excerpt=rich_text("<p>This is an excerpt </p>"), body=[{"id": "07a1f0b6-0023-45a3-83a0-38cb6a7893f1", "type": "heading", "value": "test heading"}])

root_page = Page.objects.get(id=2)
root_page.add_child(instance=blogPage)
root_page.save()

但创建带StreamField(字段名为body)的页面时,运行assertPageIsPreviewable和assertPageIsEditable测试会报错:

AssertionError: Failed to load preview for BlogPage "Test Blog" with mode="": 'body-count'

尝试过的无效方法

我没找到官方文档里关于代码创建带StreamField页面的说明,只查到nested_form_data和streamfield相关内容,试了两种写法都没用:

写法一:

blogPage = BlogPage(title="Test Blog",path="test-blog", excerpt=rich_text("<p>This is an excerpt </p>"), body=nested_form_data({'body': streamfield([('heading', 'test heading'),])}))

写法二:

blogPage = BlogPage(title="Test Blog",path="test-blog", excerpt=rich_text("<p>This is an excerpt </p>"), body=streamfield([('heading', 'test heading'),]))

之后查了Wagtail最新文档,试了两种写法也失败:

写法一:

blogPage = BlogPage(title="Test Blog",path="test-blog", excerpt=rich_text("<p>This is an excerpt </p>"))
blogPage.body.extend([('heading', "test heading")])
blogPage.save()
root_page = Page.objects.get(id=2)
root_page.add_child(instance=blogPage)
root_page.save()

写法二:

blogPage = BlogPage(title="Test Blog",path="test-blog", excerpt=rich_text("<p>This is an excerpt </p>"))
root_page = Page.objects.get(id=2)
root_page.add_child(instance=blogPage)
root_page.save()
blogPage.body.extend([('heading', "test heading")])
blogPage.save()

我还试了Stack Overflow上的解决方案,同样无效。

当前测试代码

附上我的测试代码:

class BlogTestCase(WagtailPageTestCase):
    @classmethod
    def setUpTestData(cls):
        cls.blogPage = BlogPage(title="Test Blog",path="test-blog", excerpt=rich_text("<p>This is an excerpt </p>"))
        cls.blogPage.body.extend([('heading', "test heading")])
        cls.blogPage.save()
        root_page = Page.objects.get(id=2)
        root_page.add_child(instance=cls.blogPage)
        root_page.save()
    def test_is_previewable(self):
        self.assertPageIsPreviewable(self.blogPage)
  
    def test_is_editable(self):
        self.assertPageIsEditable(self.blogPage)

我不想使用fixtures,请问在测试场景下,通过代码创建带StreamField的Wagtail页面的正确方法是什么?

内容的提问来源于stack exchange,提问作者user14665310

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:43:35