Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Wagtail CMS:查找与当前页面相关的所有页面_Django_Wagtail - Fatal编程技术网

Django Wagtail CMS:查找与当前页面相关的所有页面

Django Wagtail CMS:查找与当前页面相关的所有页面,django,wagtail,Django,Wagtail,我试图了解如何通过modelcluster ParentalKey获取指向我站点中所有页面的链接,这些页面中当前查看的页面被列为相关页面 基本设置如下所示: # RelatedLink inherits from LinkFields, # both directly copied from the wagtaildemo project class ParentPageRelatedLink(Orderable, RelatedLink): page = ParentalKey('

我试图了解如何通过modelcluster ParentalKey获取指向我站点中所有页面的链接,这些页面中当前查看的页面被列为相关页面

基本设置如下所示:

# RelatedLink inherits from LinkFields, 
# both directly copied from the wagtaildemo project

class ParentPageRelatedLink(Orderable, RelatedLink):
    page = ParentalKey('ParentPage', related_name='related_links')


class ParentPage(Page):
    parent_page_types = ['ParentPage']
    subpage_types = ['ParentPage', 'ChildPage']

    def child_pages(self):
        children = ChildPage.objects.live().descendant_of(self)
        return children

ParentPage.content_panels = [
    FieldPanel('title', classname="full title"),
    FieldPanel('body', classname="full"),
    InlinePanel(ParentPage, 'related_links', label="Related links"),
]


class ChildPage(Page):
    parent_page_types = ['ParentPage']
    parent_page_types = ['ChildPage']

    def parent_index(self):
        return self.get_ancestors().type(ParentPage).last()

ChildPage.content_panels = [
    FieldPanel('title', classname="full title"),
    FieldPanel('body', classname="full"),
    InlinePanel(ChildPage, 'related_links', label="Related links"),
]
如果理解正确,要获得每个相关链接中包含当前子页面的父页面,我必须浏览ChildPage.parent\u page\u类型中列出的每个页面,测试当前子页面是否位于ParentPage.related\u链接中,然后从每个父页面输出我需要的内容

如果父页面类型中列出了许多页面类型实例,那么对db的查询似乎会很多

有更好的办法吗

例如,modelcluster是否通过在ParentPageRelatedLink中创建的ParentalKey启用任何类型的反向引用(如Flask SQLAlchemy在使用db.relaship(backref=“something”))时提供的内容)?通过检查数据库表,它看起来不像这样

编辑

好的,看起来链接字段中的相关名称可能是实现这一点的一种方法,但由于链接字段由许多不同的类似父页面的类继承,因此我无法将其设置为类似“相关名称”的值,因此似乎我必须拥有具有其自己唯一外键的单个链接字段类(related\u name=“something”)每个父页面的定义。。。或 但是,我可能会更好地使用我最初的循环思想

class LinkFields(models.Model):
    link_external = models.URLField("External link", blank=True)
    link_page = models.ForeignKey(
        'wagtailcore.Page',
        null=True,
        blank=True,
        related_name='+'
    )
    link_document = models.ForeignKey(
        'wagtaildocs.Document',
        null=True,
        blank=True,
        related_name='+'
    )

    @property
    def link(self):
        if self.link_page:
            return self.link_page.url
        elif self.link_document:
            return self.link_document.url
        else:
            return self.link_external

    panels = [
        FieldPanel('link_external'),
        PageChooserPanel('link_page'),
        DocumentChooserPanel('link_document'),
    ]

    class Meta:
        abstract = True

您应该能够在
父页面
类中定义
@属性
。比如:

class ParentPage(Page):
    ...
    @property
    def related_pages(self):
        pages = ParentPageRelatedLink.objects.filter(page_id=self.id)
        return pages
试试这个:

parent_pages = ParentPage.objects.filter(related_links__linked_page=child_page)
“related_links”取自要查询的模型上ParentalKey的related_name属性。“链接页面”是ParentPageRelatedLink模型中要筛选的字段


父页面类型与查询页面无关。它用于为特定页面类型下可以创建的页面类型添加约束(例如,您可以说只能在博客中创建博客条目)。它与页面的查询方式无关

对,因此(最好的)方法是查询ChildPage.parent\u page\u类型中的所有类,并为每个类访问该属性。因为我有ParentPage1,ParentPage2,ParentPageN。。。我不知道哪些父页面将当前的子页面作为相关页面。这是我一直以来的做法……但不确定这是否是“最佳”方式。谢谢,这也是我所能想到的。这看起来效率非常低,因为每个父页面都有一个查询。但我可能会抓住几毫秒,这其实并不重要。感觉很“笨拙”。现在我意识到我也把东西混在一起了。。。父页面类型与相关页面无关。是时候重新考虑一下整个装置了。Wagtail中有一些类似的东西(都围绕着ParentalKey关系)。你可以尝试一个更明确的答案(我直接从核心团队那里得到了很好的信息)。仅供参考,Karl是Wagtail的核心开发者之一:)正如rnevius有益地指出的那样,非常欢迎你在谷歌集团问这样的问题,这是一个更仔细的监控。祝你好运谢谢,这看起来和@rnevius的建议很相似。没有办法做像ChildPage这样的事情。所有的页面都有这个ChildPage作为相关链接吗?tomd谢谢你,我会记住Google组。是的,你可以像rnevius建议的那样将上面的查询添加到ChildPage模型中:class ChildPage(Page):@属性定义所有包含此子页面的页面作为相关链接(self):返回ParentPage.objects.filter(相关链接链接页面=self)