J'ai une page basée sur un objet modèle, et je veux avoir des liens vers les pages précédentes et suivantes. Je n'aime pas ma solution actuelle car elle nécessite l'évaluation de l'ensemble du jeu de requête (pour obtenir la liste ids
), puis deux autres requêtes get
. Sûrement il y a un moyen de le faire en un seul passage?Comment puis-je obtenir les objets précédents et suivants à partir d'un jeu de requête ordonné filtré?
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)
Ordre de tri est défini dans le modèle, donc n'a pas à être traitées, mais sachez que vous ne pouvez pas supposer que ids sont séquentiels.
Merci, je suis vaguement au courant de la Paginator, mais n'avait pas rendu compte que je pouvais l'utiliser comme ça (ie avec un seuil de 1, en effet enveloppant juste le queryset dans un objet Paginator avec les méthodes 'has_next()', 'has_previous()'). La seule chose qui manque est que je ne commence pas au début de la plage du paginateur, mais il semble que je puisse l'obtenir avec 'p.object_list.index (start_page)'. –
Cela a fini par ne pas bien fonctionner pour moi. La classe Paginator n'est vraiment pas faite pour traverser des objets. –