【问题标题】:Detecting parent and child page types with Python using Wagtail CMS使用 Wagtail CMS 使用 Python 检测父页面和子页面类型
【发布时间】:2017-07-06 14:38:26
【问题描述】:

我正在建立一个 Wagtail 网站。

会有一个事件索引页面,其中事件作为子页面。

每个事件页面也可以有子页面,如果它是事件系列的一部分。

主事件将子事件显示为页面上的一系列链接。子事件还需要显示父事件以及它自己的兄弟事件。

在 models.py 我有一个 Event 类。到目前为止,我正在检测这样的孩子、兄弟姐妹、父母:

@property
def childpages(self):
    event_children = Event.objects.live().descendant_of(self)
    return event_children

@property
def parentpage(self):
    event_parent = self.get_parent()
    return event_parent

@property
def siblingpages(self):
    event_siblings = Event.objects.live().sibling_of(self, inclusive=False)
    return event_siblings

有没有办法找出父页面类型是什么?如果它是事件索引,我不想在事件页面上显示它。我也不希望主要活动页面显示兄弟姐妹。

我用 not_child_of(somepage) 尝试了各种方法,但不太确定如何使用它。 'somepage' 指的是什么?一个类,一个变量?我习惯了 Javascript 并且对 Python 很陌生。

【问题讨论】:

    标签: python django-queryset wagtail


    【解决方案1】:

    我是这样写的:

    @property
    def parent_event(self):
        parent_page = self.get_parent()
        if parent_page.specific_class == Event:
            return parent_page.specific  # or just `return parent_page` if you don't need the extra detail from that page
        else:
            return None
    
    @property
    def sibling_events(self):
        parent_page = self.get_parent()
        if parent_page.specific_class == Event:
            return Event.objects.live().sibling_of(self, inclusive=False)
        else:
            # this is not a child event, so don't return siblings
            return Event.objects.none()
    

    在 Python 中,检查对象是否是给定类的实例(即在 Wagtail 术语中,页面是否属于特定类型)的标准方法是 isinstance(parent_page, Event)

    但是,Wagtail 有一个额外的复杂性 - 当您使用 get_parentget_children 之类的方法上下遍历页面树时,它无法提前知道它将返回哪种页面类型 -因此,出于性能原因,它将返回 Page 类型的“最小”对象,其中仅包含所有页面共有的属性,如 title。所以,self.get_parent().title 会起作用,但self.get_parent().start_date 不会。要将其转换为正确类型的“真实”对象,您将访问属性specific,它将在后台执行额外的数据库请求以填充缺失的细节。

    (请注意,当您运行明确要求特定类型页面的查询时,这并不适用:使用像 Event.objects.sibling_of(self) 这样的查询,我们知道我们将得到 Event 页面,所以我们不'不需要在结果上调用specific。)

    所以,if isinstance(parent_page, Event): 不起作用 - 它总是错误的,因为此时 parent_page 是一个基本的 Page 对象(无论该页面是真正的 Event 还是 @987654337 @)。

    if isinstance(parent_page.specific, Event): 工作,但它的效率有点低,因为在parent_page 是事件索引页面的情况下,你会触发一个额外的数据库请求,而你没有'真的需要。更好的选择是使用parent_page.specific_class,它会告诉您页面的特定类型,而不会触发额外的数据库请求。

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多