首页 > 解决方案 > 如何在 InlinePanel 中设置初始空(可订购)项目的数量?

问题描述

我有一个名为a on a called的Orderable模型。父模型定义使用来控制 s 的添加/排序/删除。我遇到的问题是管理表单会自动为每个 s 呈现三个空 s ,我找不到任何方法来控制此设置。SetListItemParentalKeyClusterableModelFloorWithSetsFloorWithSetsInlinePanelSetListItemSetListItemFloorWithSets

该类InlinePanel接受参数来设置项目的最小和最大数量,但没有设置呈现的初始空项目的数量。

我在 Wagtail 文档中找不到有关此的任何信息。我也挖掘了源代码,找不到任何我可以覆盖的东西。InlinePanelEditHandler

我确实从InlinePanel 模板文件中看到,有一个以 id 结尾的隐藏输入,-INITIAL_FORMS它正在通过self.formset.management_form. 该字段的值始终低于 id 结尾的相邻隐藏输入-TOTAL_FORMS,这是有道理的。我只是不明白价值来自哪里或如何控制它。

我能找到的关于这INITIAL_FORMS一切的唯一信息似乎都与测试有关(例如这个文档),我看不出如何将它所说的与我需要的联系起来。

class FloorWithSets(ClusterableModel):
    page = ParentalKey(EventPage, on_delete=models.CASCADE, related_name='floor_with_sets')

    FLOOR_CHOICES = [
        ('1', 'X'),
        ('2', 'Y'),
        ('3', 'Z'),
    ]
    floor = models.CharField(
        max_length=1,
        choices=FLOOR_CHOICES,
        default='1',
    )

    panels = [
        FieldPanel('floor'),
        InlinePanel('set_list', label=_("set")),
    ]


class SetListItem(Orderable):
    floor = ParentalKey(FloorWithSets, on_delete=models.CASCADE, related_name='set_list')

    artist = models.CharField(max_length=255, blank=True, verbose_name=_('artist'))
    label = models.CharField(max_length=255, blank=True, verbose_name=_('label'))
    start_time = models.TimeField(blank=True, null=True, verbose_name=_('start time'))
    end_time = models.TimeField(blank=True, null=True, verbose_name=_('end time'))

    set_list_item = FieldRowPanel([
        FieldPanel('artist', classname="col6"),
        FieldPanel('label', classname="col6")
    ])

    set_list_item_details = FieldRowPanel([
        FieldPanel('start_time', classname="col6"),
        FieldPanel('end_time', classname="col6")
    ])

    panels = [set_list_item, set_list_item_details]

标签: wagtail

解决方案


我想我找到了解决办法。尝试使用自定义元Form类为您的EventPage模型创建一个自定义类,如下所示:

class EventPageFormMetaclass(WagtailAdminModelFormMetaclass):
    @classmethod
    def child_form(cls):
        return EventPageForm


class EventPageForm(WagtailAdminPageForm, metaclass=EventPageFormMetaclass):
    pass


class EventPage(Page):
    # Whatever you have in your model

    base_form_class = EventPageForm

我相信问题源于这样一个事实,即为子模型创建实例ClusterFormMetaclass硬编码的。ClusterForm所以你EventPage得到一个WagtailAdminPageForm,但FloorWithSets模型得到一个ClusterForm。如果你停在那里,那很好,但是当它FloorWithSets生成它是内联面板时,它ClusterForm会这样做,它的元类extra_form_count设置为 3,而不是WagtailAdminPageForm它的元类设置为 0。

所以上面的解决方案创建了一个新Form类,它的元类覆盖child_form类方法以返回一个设置为 0的Form类。extra_form_count

唷。


推荐阅读