【问题标题】:Using a Wagtail "ChoiceBlock" with dynamic choices rather than a hardcoded list使用带有动态选择而不是硬编码列表的 Wagtail “ChoiceBlock”
【发布时间】:2020-07-13 13:24:29
【问题描述】:

我们有一个博客模型的设置,该模型与 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 固定的列表?

【问题讨论】:

    标签: django wagtail


    【解决方案1】:

    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,
        )
    

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

    【讨论】:

    • 这是否意味着每当在 admin 中创建新的 BlogPageCategory 对象时,都需要运行迁移?
    • @PhilGyford 否 - 只要您使用 choices=get_categories,迁移将保存对 get_categories 函数的引用,该函数在迁移过程中将保持不变。 (如果您改为使用choices=get_categories(),您最终会得到嵌入到迁移中的那一刻的评估列表,因此您希望避免这种情况。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多