如何在InlinePanel中设置初始空(可订购)项目的数量?

时间:2019-08-15 13:12:17

标签: wagtail

我有一个名为Orderable的{​​{1}}模型,在名为SetListItem的{​​{1}}上有一个ParentalKey。父ClusterableModel模型定义使用FloorWithSets来控制FloorWithSets的添加/排序/删除。我遇到的问题是,管理表单会自动为每个InlinePanel呈现三个空的SetListItem,而我找不到任何方法来控制此设置。

SetListItem类将parameters带到例如设置项目的最小和最大数量,但不设置要呈现的初始空项目的数量。

我在Wagtail文档中找不到与此有关的任何信息。我还为FloorWithSetsInlinePanel挖掘了source,但是找不到我可以覆盖的内容。

我确实从InlinePanel template file看到了一个隐藏的输入,其ID以InlinePanel结尾,该输入通过EditHandler呈现。此字段的值始终低于ID以-INITIAL_FORMS结尾的相邻隐藏输入,这很有意义。我只是不知道价值来自何处或如何控制它。

我能找到的关于self.formset.management_form的唯一信息似乎都与测试有关(例如this documentation),而且我看不到如何将所说的与我的需求联系起来。

-TOTAL_FORMS

1 个答案:

答案 0 :(得分:1)

我想我已经找到了解决方案。尝试使用以下自定义元类为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

我认为问题源于ClusterFormMetaclasshard-coded来为子模型创建ClusterForm实例的事实。因此,您的EventPage得到了WagtailAdminPageForm,但是FloorWithSets模型得到了ClusterForm。如果您停在那里,就可以了,但是当FloorWithSets生成它是内嵌面板时,它就像ClusterForm那样做,其元类的extra_form_count设置为3,与WagtailAdminPageForm的元类将其设置为0相对。

因此,上述解决方案创建了一个新的Form类,该类的元类将覆盖child_form类方法,以返回Form设置为0的extra_form_count类。

哇。