Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wagtail: Get previous or next sibling

I'm creating a page with wagtail where I need to know the previous and next sibling of the current page:

In my portrait page model, I tried to define two methods to find the correct urls, but I'm missing a crucial part. To get the first sibling, I can just do the following:

class PortraitPage(Page):

    ...

    def first_portrait(self):
        return self.get_siblings().live().first().url

There is the first() and last() method, but there doesn't seem to be a next() or previous() method to get the direct neighbours (in the order that they are arranged in the wagtail admin).

Is there any way to achieve this?

like image 774
nils Avatar asked May 20 '15 09:05

nils


2 Answers

Django-Treebeard provides get_next_sibling and get_prev_sibling which will return your direct siblings in the tree, but these are not necessarily your next published sibling. To request those you can use:

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

Which can obviously also be chained with any other queryset operations.

like image 63
Danielle Madeley Avatar answered Oct 26 '22 23:10

Danielle Madeley


After going through the debugger for a while, I found out that wagtail already has two methods: get_prev_sibling() and get_next_sibling().

So the methods could look like this (accounting for the first page in the previous method and the last item in the next method):

def prev_portrait(self):
    if self.get_prev_sibling():
        return self.get_prev_sibling().url
    else:
        return self.get_siblings().last().url

def next_portrait(self):
    if self.get_next_sibling():
        return self.get_next_sibling().url
    else:
        return self.get_siblings().first().url
like image 37
nils Avatar answered Oct 27 '22 00:10

nils