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

标签 django django-models wagtail django-modeladmin

我已经创建了一个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

关于django - Wagtail ModelAdmin > 如何为 InlinePanel 设置初始数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41979603/

相关文章:

django 获取关联数据一对一字段

django - 如何将上传文件字段添加到 Wagtail 表单?

django - Wagtail 模型的自定义 URL

django - 为什么我的 django 模板上下文处理器没有被调用

Django auth - 添加用户字段 - 在管理员中显示

python - 独立的 Django 设置

Django - 网络商店模型组织

python - Wagatail 嵌入 YouTube - 阻止相关视频显示

python - Django Rest Framework - 添加 JOIN 端点

python - ValueError : Cannot serialize: <myproject. storage.AzureStorage 对象位于 0x7f85185e66d0>