如何在 Wagtail 中为多个页面 类 创建标签字段?

How to create a tags field for multiple Page classes in Wagtail?

我想为我网站中几乎每个模型都会有的关键字添加一个字段。如果我不必为每个页面模型定义一个“TaggedPage”class,那将是理想的。所以我创建了一个 BasePage 抽象模型,但 ParentalKey 似乎不适用于抽象模型。我该如何解决?

我收到这个错误:

home.TaggedPage.content_object: (fields.E300) Field defines a relation with model 'home.BasePage', which is either not installed, or is abstract.
home.TaggedPage.content_object: (fields.E307) The field home.TaggedPage.content_object was declared with a lazy reference to 'home.basepage', but app 'home' doesn't provide model 'basepage'.

home/models.py 包含这些模型:

class PageTag(TagBase):
    """ Tag used for the keywords meta html tag"""

    class Meta:
        verbose_name = "search/meta keyword"
        verbose_name_plural = "search/meta keywords"


class TaggedPage(ItemBase):

    tag = models.ForeignKey(
        PageTag,
        related_name="tagged_pages",
        on_delete=models.CASCADE,
    )

    content_object = ParentalKey(
        to='home.BasePage',
        on_delete=models.CASCADE,
        related_name='tagged_items'
    )


class BasePage(MetadataPageMixin, Page):

    tags = ClusterTaggableManager(
        through='home.TaggedPage',
        blank=True,
        help_text="Used for the keywords meta html tag",
    )

    promote_panels = Page.promote_panels + [
        FieldPanel('tags'),
    ]

    class Meta:
        abstract = True


class HomePage(BasePage):
    parent_page_types = []


    

改为将 ParentalKey 指向 Page 模型:

content_object = ParentalKey(
    to='wagtailcore.Page',
    on_delete=models.CASCADE,
    related_name='tagged_items'
)

在数据库级别,这将具有您正在寻找的行为:引用页面对象 ID 的外键字段。一个小的副作用是 tagged_items 关系将在所有页面对象上定义,而不仅仅是从 BasePage 继承的对象,但这不会导致任何问题。