【发布时间】:2021-02-01 22:06:01
【问题描述】:
是否有人拥有或知道在不同页面模型之间设置多对多关系的方法(示例代码和/或说明)?如果我有 PersonPage 和 SitePage 模型,我如何连接页面(一个人可以在多个站点工作,一个站点可以有多个人在那里工作)?
这是我发现的与该主题相关但不直接相关的内容——
-
Wagtail 文档:通过搜索“多对多”,only hit 位于 taggit 模块(食谱页面)的部分中。
-
Wagtail 文档:the only reference 到 ParentalManyToManyField 演示了如何使用它在页面和类别之间创建 M2M(教程)
-
This 2015 post 关于 Wagtail 中的 M2M 关系(在 an SO 'answer' 中引用了我在这里问的基本相同的问题)。虽然它没有讨论页面-页面关系,但所提出的方法可能适用于工作。根据我尝试设置 InlinePanel 调用的方式,我修改后的模仿失败并出现各种错误 - 但帖子中的示例代码以同样的方式失败,因此要么没有经过测试,要么在 2.x 中已过时。
class PersonPage(Page):
pass
PersonPage.content_panels = [
InlinePanel('ps_links', label='PS Links'),
]
class PersonSitePageLink():
spage = models.ForeignKey('SitePage', on_delete=models.SET_NULL, related_name='sites')
ppage = ParentalKey('PersonPage', related_name='ps_links', on_delete=models.SET_NULL,)
panels = [
FieldPanel('spage')
]
class SitePage(Page):
pass
- This technique 可以很好地将 Page 模型与其自身相关联,但将其扩展为包含两个不同的模型会创建两个平行但未连接的关系集(您可以选择任意 Bug 页面链接到任何 Plant 页面,反之亦然,但 Plants编辑错误时选择的不显示)。我想我在代码中明白了原因,但我不明白如何在两个页面之间建立单个 M2M 连接。
class PlantPage(Page):
related_bugs = ParentalManyToManyField('BugPage', blank=True)
content_panels = Page.content_panels + [
FieldPanel('related_bugs'),
]
class BugPage(Page):
related_plants = ParentalManyToManyField('PlantPage', blank=True)
content_panels = Page.content_panels + [
FieldPanel('related_plants'),
]
- This one 也只讨论页内模型(而不是页间模型)M2M。 (它是先于 ParentalManyToManyField 的,实际上只能从 Wayback Machine 获得。)
【问题讨论】:
标签: wagtail