Wagtail ModelAdmin > 如何为 InlinePanel 设置初始数据?

Wagtail ModelAdmin > how to set initial data for an InlinePanel?

我创建了一个 Planning 和一个 Meeting 模型。我使用 Wagtail 的 ModelAdmin 来管理它们。 Planning 有一个 planning_panels 这是一个 InlinePanel.

对于其他模型,我可以使用表单的 __init__ 方法设置初始数据。
但是我不知道如何为 InlinePanel 使用的 formsets 实现这个。有人有什么想法吗?这是代码:

class Planning(ClusterableModel):

    base_form_class = PlanningForm

    planning_panels = [
        InlinePanel(
            'planning_meetings',
            min_num = 2,
            max_num = 8,
            label = 'meetings'
        )
    )
    edit_handler = TabbedInterface([
        ObjectList(planning_panels, heading=_('meetings')),
    ])


class PlanningMeeting(models.Model):

    planning = ParentalKey(
        'cms.Planning',
        related_name='planning_meetings',
    )
    start = models.DateTimeField(
        'start'
    )
    finish = models.DateTimeField(
        'finish'
    )
    panels = [
        FieldPanel('start'),
        FieldPanel('finish')
    ]

    class Meta:
        verbose_name = 'Planned meeting'


class PlanningForm(WagtailAdminModelForm):

    class Meta:
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        instance = kwargs.get('instance')
        if not instance or not instance.pk:
            initial = kwargs.get('initial', {})
            initial.update({
                'some_fiel': 'some_value'
            })
            kwargs['initial'] = initial
        super().__init__(*args, **kwargs)


class CreatePlanningView(CreateView):

    pass


class PlanningAdmin(ModelAdmin):
    model = Planning
    create_view_class = CreatePlanningView

wagtail 的 InlinePanel 是使用 django-modelcluster 包。考虑到这一点,您可以通过覆盖 CreateView 中的 get_instance 方法将初始数据添加到 wagtail create model admin 中,然后添加 planning_meetings 列表。

代码如下:

class CreatePlanningView(CreateView):
    def get_instance(self):
      instance = super().get_instance()

      # add the initial inline panels here
      instance.planning_meetings = [
        PlanningMeeting(start=start, end=end),
        PlanningMeeting(start=start, end=end)
        # ... add more initial datas
      ]

      # dont forget to return the instance
      return instance

提示来自 django-modelcluster 文档 https://github.com/wagtail/django-modelcluster