使用或重用 Wagtail StreamField 块作为其他模型中的字段

axo*_*asm 5 python wagtail wagtail-streamfield

我有一个 Wagtail 项目,有两个不同的Page模型,它们使用相同的画廊块,但方式不同。在一个模型中,我想在其他自由形式块的列表中使用图库;但在另一种模型中,只有一个画廊出现在页面上的特定位置。画廊非常复杂,有很多选项,例如autoadvance我不想在模型之间重复,并且很难将其移动到 mixin 中。gallery我可以通过向严格模型添加额外的 StreamField 来完成我想要的,如下所示:(content_panel等省略)

\n
# models.py\nfrom wagtail.models import Page\nfrom wagtail.core.fields import RichTextField, StreamField\nfrom wagtail.images.blocks import ImageChooserBlock\nfrom wagtail.core.blocks import (\n    RichTextBlock, \n    StructBlock, \n    StreamBlock,\n)\n\nclass ImageWithCaptionBlock(StructBlock):\n    image = ImageChooserBlock()\n    caption = RichTextBlock()\n\n\nclass GalleryBlock(StructBlock):\n    # lots of gallery options like \xe2\x80\x9cautoadvance\xe2\x80\x9d\n    items = StreamBlock([\n        (\'image\', ImageWithCaptionBlock()),\n        (\'video\', EmbedBlock()),\n    ])    \n\n\nclass FreeFormContentPage(Page):\n    body = StreamField([\n        (\'richtext\', RichTextBlock()),\n        (\'gallery\', GalleryBlock()),\n    ], use_json_field=True)\n\n\nclass StrictContentPage(Page):\n    body = RichTextField()\n    gallery = StreamField([\n         (\'gallery\', GalleryBlock()),\n    ], use_json_field=True, max_num=1)\n\n
Run Code Online (Sandbox Code Playgroud)\n

这可行,但在编辑 ! 时看起来有点奇怪StrictContentPage

\n

显示嵌套 \xe2\x80\x9cGallery\xe2\x80\x9d 元素的 wagtail 管理 UI 的屏幕截图

\n

我\xe2\x80\x99m 想做的是这样的:

\n
\nclass StrictContentPage(Page):\n    body = RichTextField()\n    gallery = GalleryBlock()\n\n
Run Code Online (Sandbox Code Playgroud)\n

(或通过调整管理员进行等效操作)

\n

\xe2\x80\xa6 以便管理体验如下所示:

\n

Wagtail 管理 UI 的屏幕截图,显示一个带有图像块的 \xe2\x80\x9cGallery\xe2\x80\x9d 元素

\n

预先感谢您的任何指点!

\n

小智 1

StreamBlock如果您仍然需要这个,我会以为/内的内容创建变量的心态来处理它StreamField

\n

考虑以下示例:

\n
class ImageWithCaptionBlock(StructBlock):\n    image = ImageChooserBlock()\n    caption = RichTextBlock()\n\nGALLERY_BLOCKS = [\n    (\'image\', ImageWithCaptionBlock()),\n    (\'video\', EmbedBlock()),\n]\n\nclass GalleryBlock(StructBlock):\n    # lots of gallery options like \xe2\x80\x9cautoadvance\xe2\x80\x9d\n    items = StreamBlock(GALLERY_BLOCKS)    \n\nclass FreeFormContentPage(Page):\n    body = StreamField([\n        (\'richtext\', RichTextBlock()),\n        (\'gallery\', GalleryBlock()),\n    ], use_json_field=True)\n\nclass StrictContentPage(Page):\n    body = RichTextField()\n    gallery = StreamField(GALLERY_BLOCKS, use_json_field=True)\n
Run Code Online (Sandbox Code Playgroud)\n

这种方法将使StrictContentPage页面版本的 UI 更具可读性,并保持版本相同的用户体验FreeFormContentPage。另外,您不需要多余的代码来更改不同页面类型的字段。

\n

我希望这能帮助你。祝你有美好的一天!

\n