首页 > 解决方案 > Wagtail 的 InlinePanel 是否与非页面模型兼容?

问题描述

我有一个 wagtail 非页面模型,我想使用它InlinePanel,以便我可以在父表单中编辑多个内联项目。

class Parent(ClusterableModel):
   panels = [...,
        InlinePanel('child_items')
   ]

class Child(Orderable):
   value = models...
   parent_value = ParentalKey('.Parent', on_delete=models.CASCADE, related_name='child_items')

但不幸的是,内联面板没有在 wagtail 管理 UI 中呈现。

快速浏览一下代码,似乎InlinePanel需要一个 Page 对象/编辑器,所以我想我会在这里问是否有办法InlinePanel在非 Page 对象上使用 an,或者是否有更好的方法来实现StackedInline在 wagtail 管理员中对非页面对象进行内联编辑(如 django 的)。

标签: wagtail

解决方案


InlinePanel如果将非页面模型注册为片段或通过 ModelAdmin 注册,则它们确实适用于非页面模型。您的代码的工作版本是(在新创建的 Wagtail 项目上测试,home/models.py替换为以下代码):

from django.db import models
from modelcluster.fields import ParentalKey
from modelcluster.models import ClusterableModel

from wagtail.admin.edit_handlers import FieldPanel, InlinePanel
from wagtail.core.models import Page, Orderable
from wagtail.snippets.models import register_snippet

class HomePage(Page):
    pass


@register_snippet
class Parent(ClusterableModel):
    title = models.CharField(max_length=255)
    panels = [
        FieldPanel('title'),
        InlinePanel('child_items', label='Child items'),
    ]

class Child(Orderable):
    parent_value = ParentalKey(Parent, on_delete=models.CASCADE, related_name='child_items')
    value = models.CharField(max_length=255)

    panels = [
        FieldPanel('value'),
    ]

推荐阅读