wagtail的Factory boy类
项目描述
wagtail-factories
Wagtail CMS 的工厂类
加入 Wagtail Space 社区!
今年加入我们参加 Wagtail Space US!Wagtail Space 2024 两个活动的参与邀请和注册现已开放。我们非常希望您在 6 月发表演讲,或者仅仅作为参会者。
- Wagtail Space NL,荷兰阿恩赫姆。2024-06-14
- Wagtail Space US,宾夕法尼亚州费城。2024-06-20 至 2024-06-22
安装
pip install wagtail-factories
用法
文档仍在进行中,但请参阅测试以获取更多示例。
import wagtail_factories
from . import models
class MyCarouselItemFactory(wagtail_factories.StructBlockFactory):
label = 'my-label'
image = factory.SubFactory(
wagtail_factories.ImageChooserBlockFactory)
class Meta:
model = models.MyBlockItem
class MyCarouselFactory(wagtail_factories.StructBlockFactory):
title = "Carousel title"
items = wagtail_factories.ListBlockFactory(
MyCarouselItemFactory)
class Meta:
model = models.MyCarousel
class MyNewsPageFactory(wagtail_factories.PageFactory):
class Meta:
model = models.MyNewsPage
class MyNewsPageChooserBlockFactory(wagtail_factories.PageChooserBlockFactory):
page = factory.SubFactory(MyNewsPageFactory)
class MyTestPageFactory(wagtail_factories.PageFactory):
body = wagtail_factories.StreamFieldFactory({
'carousel': factory.SubFactory(MyCarouselFactory),
'news_page': factory.SubFactory(MyNewsPageChooserBlockFactory),
})
class Meta:
model = models.MyTestPage
def test_my_page():
root_page = wagtail_factories.PageFactory(parent=None)
my_page = MyTestPageFactory(
parent=root_page,
body__0__carousel__items__0__label='Slide 1',
body__0__carousel__items__0__image__image__title='Image Slide 1',
body__0__carousel__items__1__label='Slide 2',
body__0__carousel__items__1__image__image__title='Image Slide 2',
body__0__carousel__items__2__label='Slide 3',
body__0__carousel__items__2__image__image__title='Image Slide 3',
body__1__news_page__page__title="News",
)
使用 StreamBlockFactory
StreamBlockFactory
可以与其他块工厂类型一起使用,以创建复杂的嵌套 StreamValues
,就像 StreamBlock
可以用于声明复杂 StreamField
的块一样。
首先,定义您的 StreamBlockFactory
子类,使用 factory.SubFactory
来包装子块声明。请确保将您的 StreamBlock
子类作为模型属性包含在内部 Meta
类中。
class MyStreamBlockFactory(wagtail_factories.StreamBlockFactory):
my_struct_block = factory.SubFactory(MyStructBlockFactory)
class Meta:
model = MyStreamBlock
然后,将您的 StreamBlockFactory
子类包含在模型工厂中,作为 StreamFieldFactory
的参数。
class MyPageFactory(wagtail_factories.PageFactory):
body = wagtail_factories.StreamFieldFactory(MyStreamBlockFactory)
class Meta:
model = MyPage
然后,您可以使用修改后的 factory_boy 的深度对象声明语法来动态构建 StreamValues
。
MyPageFactory(
body__0__my_struct_block__some_field="some value",
body__0__my_struct_block__some_other_field="some other value",
)
要为块工厂生成默认值,在索引处终止您的声明,并使用块名称作为值。
MyPageFactory(body__0="my_struct_block")
替代 StreamFieldFactory 声明语法
在版本 3.0 之前,StreamFieldFactory
只能通过提供映射块名称到块工厂类的字典作为单个参数来使用,例如
class MyTestPageWithStreamFieldFactory(wagtail_factories.PageFactory):
body = wagtail_factories.StreamFieldFactory(
{
"char_array": wagtail_factories.ListBlockFactory(
wagtail_factories.CharBlockFactory
),
"int_array": wagtail_factories.ListBlockFactory(
wagtail_factories.IntegerBlockFactory
),
"struct": MyBlockFactory,
"image": wagtail_factories.ImageChooserBlockFactory,
}
)
class Meta:
model = models.MyTestPage
此声明方式仍然受支持,但要注意,此方法不支持嵌套流块。从版本 3.0 开始,此风格定义中的所有 BlockFactory
值都必须包装在 factory_boy 的 SubFactories
中。例如,上面的示例必须更新为以下内容以兼容 3.0。
class MyTestPageWithStreamFieldFactory(wagtail_factories.PageFactory):
body = wagtail_factories.StreamFieldFactory(
{
"char_array": wagtail_factories.ListBlockFactory(
wagtail_factories.CharBlockFactory
),
"int_array": wagtail_factories.ListBlockFactory(
wagtail_factories.IntegerBlockFactory
),
"struct": factory.SubFactory(MyBlockFactory),
"image": factory.SubFactory(wagtail_factories.ImageChooserBlockFactory),
}
)
class Meta:
model = models.MyTestPage
此要求不适用于 ListBlockFactory
,它是 SubFactory
的子类。