Mam stronę opartą na obiekcie modelu i chcę mieć linki do poprzedniej i następnej strony. Nie podoba mi się moje obecne rozwiązanie, ponieważ wymaga oceny całego zestawu zapytań (aby uzyskać listę ids
), a następnie dwóch kolejnych zapytań get
. Z pewnością jest sposób, w jaki można to zrobić za jednym razem?Jak mogę uzyskać poprzednie i następne obiekty z przefiltrowanego, uporządkowanego zestawu pytań?
def get_prev_and_next_page(current_page):
ids = list(Page.objects.values_list("id", flat=True))
current_idx = ids.index(current_page.id)
prev_page = Page.objects.get(id=ids[current_idx-1])
try:
next_page = Page.objects.get(id=ids[current_idx+1])
except IndexError:
next_page = Page.objects.get(id=ids[0])
return (prev_page, next_page)
Porządek jest zdefiniowany w modelu, więc nie muszą być traktowane tutaj, ale należy pamiętać, że nie można przyjąć, że identyfikatory są sekwencyjne.
Dzięki, miałem niejasno świadomy paginator, ale nie zrozumiałem, że mogę go używać tak (tj progu 1, w efekcie tylko owijanie queryset w obiekcie paginator za pomocą metod 'has_next()', 'has_previous()'). Jedyne, czego mi brakuje to to, że nie zaczynam od początku zakresu paginatora, ale wygląda na to, że mogę to uzyskać za pomocą 'p.object_list.index (start_page)'. –
To nie działało dobrze dla mnie. Klasa Paginator naprawdę nie jest stworzona do przechodzenia przez obiekty. –