将鹡鸰"ChoiceBlock"与动态选择而不是硬编码列表一起使用



我们有一个Blog模型的设置,该模型与BlogPageCategory有很多关系,我们有一种"最近的博客文章"流字段块,可以指定是显示X个最新的博客文章的卡片,还是显示特定类别中的X个最晚的博客文章。

因此,我们从以下代码开始:

from wagtail.core import blocks

class RecentBlogEntries(blocks.StructBlock):
title = blocks.CharBlock(
required=True,
)
category_filter = blocks.ChoiceBlock(
label='Filter by Category',
required=False,
choices=[
('all', 'All'),
('First Category', 'First Category'),
('...',. '...'),
],
)
...

但是,对类别进行硬编码有点傻,而且能够从"现在的列表是什么,基于BlogPageCategory的CMS数据"中选择它们会方便得多。然而,以下代码(当然(变成了一个同样硬编码的迁移:

from wagtail.core import blocks
from ... import BlogPageCategory

class RecentBlogEntries(blocks.StructBlock):
title = blocks.CharBlock(
required=True,
)
choices = [ (cat.name, cat.name) for cat in BlogPageCategory.objects.all()]
choices.sort()
choices.insert(0, ('all', 'All'))
category_filter = blocks.ChoiceBlock(
label='Filter by Category',
required=False,
choices=choices,
)
...

有什么方法可以使它成为一个动态值,而不是由makemigrations固定的列表吗?

ChoiceBlock接受一个可调用函数作为choices参数:

def get_categories():
return [(cat.name, cat.name) for cat in BlogPageCategory.objects.all()]

class RecentBlogEntries(blocks.StructBlock):
title = blocks.CharBlock(
required=True,
)
category_filter = blocks.ChoiceBlock(
label='Filter by Category',
required=False,
choices=get_categories,
)

需要在模块的顶层定义可调用项,以便迁移可以引用它(即它不能是类上的方法(,如果它随后被移动或重命名,则需要相应地编辑迁移。

最新更新