Python 摇摆:获得上一个或下一个兄弟姐妹

Python 摇摆:获得上一个或下一个兄弟姐妹,python,django,wagtail,Python,Django,Wagtail,我正在使用wagtail创建一个页面,我需要知道当前页面的上一个和下一个同级: 在我的纵向页面模型中,我试图定义两种方法来查找正确的URL,但我缺少一个关键部分。要获得第一个兄弟姐妹,我可以执行以下操作: class PortraitPage(Page): ... def first_portrait(self): return self.get_siblings().live().first().url {# This is a template #} P

我正在使用wagtail创建一个页面,我需要知道当前页面的上一个和下一个同级:

在我的纵向页面模型中,我试图定义两种方法来查找正确的URL,但我缺少一个关键部分。要获得第一个兄弟姐妹,我可以执行以下操作:

class PortraitPage(Page):

    ...

    def first_portrait(self):
        return self.get_siblings().live().first().url
{# This is a template #}
Previous Sibling: {{ page.next_sibling }}
Next Sibling: {{ page.prev_sibling }}
first()
last()
方法,但似乎没有
next()
previous()
方法来获取直接邻居(按照它们在wagtail管理中的排列顺序)


有什么方法可以做到这一点吗?

经过一段时间的调试,我发现wagtail已经有了两种方法:
get\u prev\u sibling()
get\u next\u sibling()

因此,这些方法可以如下所示(说明前一种方法的第一页和下一种方法的最后一项):

提供
get_next_sibling
get_prev_sibling
,它们将返回树中的直接同级,但不一定是下一个发布的同级。要请求您可以使用的内容,请执行以下操作:

prev = page.get_prev_siblings().live().first()
next = page.get_next_siblings().live().first()

这显然也可以与任何其他queryset操作链接。

这里有一个版本处理
未发布的
同级

def下一幅肖像(自):
next\u sibling=self.get\u next\u sibling()
如果下一个兄弟姐妹和下一个兄弟姐妹.live:
返回next_sibling.url
其他:
下一个发布的兄弟姐妹=self.get下一个兄弟姐妹(
包含=错误
).live()
如果len(下一个发布的兄弟姐妹):
返回下一个\u已发布的\u同级[0]。url
返回self.get_同胞().live().first().url
def prev_肖像(自):
previous\u sibling=self.get\u prev\u sibling()
如果上一个兄弟姐妹和上一个兄弟姐妹.live:
返回上一个_sibling.url
其他:
上一个发布的兄弟姐妹=self.get上一个兄弟姐妹(
包含=错误
).live()
如果len(以前发布的兄弟姐妹):
返回以前发布的兄弟姐妹[0]。url
返回self.get_同胞().live().last().url

您可以在类中定义继承自
页面的属性

兄弟姐妹 如果您想要
页面
实例的同级,可以使用以下选项(基于Danielle Madeley的回答):

同班兄弟姐妹 如果您想要查看
肖像页面的同级
,请在
类型
方法中指定
self.\uuuuu class\uuuu
,如下所示:

class PortraitPage(Page):
    # ...
    @property
    def next_sibling(self):
        return self.get_next_siblings().type(self.__class__).live().first()

    @property
    def prev_sibling(self):
        return self.get_prev_siblings().type(self.__class__).live().first()
模板 如果要在模板中使用这些属性,请在定义属性后执行以下操作:

class PortraitPage(Page):

    ...

    def first_portrait(self):
        return self.get_siblings().live().first().url
{# This is a template #}
Previous Sibling: {{ page.next_sibling }}
Next Sibling: {{ page.prev_sibling }}

我想它来自页面模型,但我还没有研究它。我只是做了一个
dir(self)
并查看了可用的方法。它是有效的。你有哪种版本的摇尾蛇?我正在做第1节。0b1@rnevius啊,在这里,wagtail 0.4的发行说明中只提到了它:Hi@nils和@rnevius,
get\u prev\u sibling()
get\u next\u sibling()
方法来自处理wagtail页面层次结构的Treebeard,并记录在这里:P.s.@nils,如果你使用的是1.0b1,你应该看看我们今天发布的1.0b2:谢谢@tomd!我们说话的时候我正在运行beta2;-)@tomd我刚刚意识到“get_next_sibling()”不包含我在页面模型中定义的字段(例如“header_image”)。有没有一种方法可以访问这些内容?有没有任何方法可以在Django模板中实现相同的结果?