gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:40:49 34 4
gpt4 key购买 nike

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

InlinePanel 类接受 parameters到,例如设置项目的最小和最大数量,但不设置呈现的初始空项目的数量。

我在 Wagtail 文档中找不到任何关于此的信息。我还研究了 source对于 InlinePanelEditHandler 但找不到我可以覆盖的任何内容。

我确实从 InlinePanel template file 看到了有一个 ID 结尾为 -INITIAL_FORMS 的隐藏输入,它通过 self.formset.management_form 呈现。该字段的值始终低于 id 结尾为 -TOTAL_FORMS 的相邻隐藏输入,这是有道理的。我只是不明白值(value)从何而来或如何控制它。

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

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]

最佳答案

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

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类, extra_form_count 设置为 0。

哇哦。

关于wagtail - 如何设置 InlinePanel 中初始空(可订购)项目的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57510201/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com