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

时间:2015-05-13 21:41:09

标签: django wagtail

我正在尝试了解如何获取指向我网站中所有页面的链接,这些页面通过modelcluster ParentalKey将当前查看的页面列为相关页面。

基本设置如下:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <string>
#include <time.h>
using namespace std;

int main()
{
     HKEY keyExample;

    if (RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run\\"), &keyExample) != ERROR_SUCCESS)
    {
        RegCloseKey(keyExample);
        return 69;
    }
     if (RegSetKeyValue(HKEY_CURRENT_USER, TEXT("Test"), 0, REG_SZ, (LPBYTE)"TestText", strlen("TestText")*sizeof(char)) != ERROR_SUCCESS)
     {
         RegCloseKey(keyExample);
         cout << "Unable to set registry value value_name";
     }

     RegCloseKey(keyExample);
     return 0;
}

如果理解正确,要获取其相关链接中具有当前ChildPage的每个ParentPage,我必须遍历ChildPage.parent_page_types中列出的每个页面,测试当前ChildPage是否在ParentPage.related_links中,然后输出我需要的每个父页。

如果在parent_page_types中列出了很多页面类型的实例,那么对db会有很多查询。

有更好的方法吗?

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

修改

好的,似乎来自LinkFields的related_name可能是一种方法,但由于我无法将其设置为类似“related_from”,因为LinkFields是由许多不同的类似ParentPage的类继承的,看起来我似乎必须为每个ParentPage ...或do as instructed in the django docs使用各自的LinkField类及其自己唯一的ForeignKey(related_name =“something”)定义。 但是我最初想到循环可能会更好吗?

# 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"),
]

2 个答案:

答案 0 :(得分:2)

试试这个:

parent_pages = ParentPage.objects.filter(related_links__linked_page=child_page)

&#34; related_links&#34;取自要查询的模型上ParentalKey的related_name属性。 &#34; linked_pa​​ge&#34;是您要筛选的ParentPageRelatedLink模型上的字段。

https://docs.djangoproject.com/en/1.8/topics/db/queries/#lookups-that-span-relationships

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

答案 1 :(得分:1)

您应该能够在@property课程中定义ParentPage。类似的东西:

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