跳转到主要内容

wagtail的Factory boy类

项目描述

wagtail-factories

Wagtail CMS 的工厂类

加入 Wagtail Space 社区!

今年加入我们参加 Wagtail Space US!Wagtail Space 2024 两个活动的参与邀请和注册现已开放。我们非常希望您在 6 月发表演讲,或者仅仅作为参会者。

安装

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 的子类。

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码发行版

wagtail_factories-4.2.1.tar.gz (9.5 kB 查看哈希)

上传 源代码

构建发行版

wagtail_factories-4.2.1-py2.py3-none-any.whl (10.6 kB 查看哈希)

上传 Python 2 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面