为何WagtailPageTests.assertCanCreate传入StreamField数据未触发测试失败?
这事儿本质是Wagtail的字段处理逻辑和测试默认验证规则共同导致的,具体说有这几点:
RichTextField的自动兼容解析:Wagtail的RichTextField在接收数据时,底层表单处理逻辑会做宽松兼容。当你传入StreamField格式的结构化数据(比如包含
type和value的字典列表),它会自动识别并提取rich_text类型块里的value值(也就是HTML内容),最终还是把纯HTML字符串存入数据库,不会因为输入结构不符合RichTextField的常规格式而报错。WagtailPageTests的默认验证逻辑:WagtailPageTests的默认测试方法(比如
test_can_create_page)只校验页面能不能成功创建,不会去严格检查你传入的输入数据结构是否完全匹配字段定义。只要数据能被字段解析并完成存储,测试就会判定通过,不会主动做格式校验。RichTextField的存储本质:RichTextField底层就是存HTML字符串的,不管你传的是原始HTML还是StreamField格式的结构,只要最终能转换成合法的HTML,模型层的
clean()方法就会放行,不会抛出验证错误。
举个实际例子,如果你传入的StreamField格式数据是:
body = [{"type": "rich_text", "value": "<p>测试内容</p>"}]
Wagtail会自动提取value里的<p>测试内容</p>存入数据库,和你直接传这个HTML字符串的效果完全一样,所以页面创建成功,测试自然通过。
如果想要严格测试字段的输入格式,你得自己加断言,比如创建页面后,检查page.body的内容是不是你预期的纯HTML字符串,而不是只依赖默认的创建成功验证。
内容的提问来源于stack exchange,提问作者BrendaD

