wagtail - 如何在 InlinePanel 中设置初始空(可订购)项目的数量?
问题描述
我有一个名为a on a called的Orderable
模型。父模型定义使用来控制 s 的添加/排序/删除。我遇到的问题是管理表单会自动为每个 s 呈现三个空 s ,我找不到任何方法来控制此设置。SetListItem
ParentalKey
ClusterableModel
FloorWithSets
FloorWithSets
InlinePanel
SetListItem
SetListItem
FloorWithSets
该类InlinePanel
接受参数来设置项目的最小和最大数量,但没有设置呈现的初始空项目的数量。
我在 Wagtail 文档中找不到有关此的任何信息。我也挖掘了源代码,但找不到任何我可以覆盖的东西。InlinePanel
EditHandler
我确实从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]
解决方案
我想我找到了解决办法。尝试使用自定义元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
唷。
推荐阅读
- r - rpy2: Reading a file to a Float Vector
- python-3.x - discord.py (Python 3.6.5 Discord) says 'invalid syntax' on 'def' everytime I try and run my Discord bot
- regex - 为非结构化数据创建一个配置单元表
- c# - 运行多个 sql 命令
- python - OpenCV "cv2.omnidir.calibrate" throws an Assertion Error
- android - 可搜索的微调器不起作用
- javascript - Array.filter 不能准确返回对象的属性?
- json - Swift .flatMap not initializing json data into struct
- excel - 即使右下角的单元格为空,Excel 也选择范围
- spring-boot - Spring批处理:如何在运行时动态更改作业的固定延迟