Problema de paginação
-
05-07-2019 - |
Pergunta
Estou usando este código para minha paginação e gostaria que a escolha do usuário seja persistente em todo o site (isso foi resolvido até agora) ... O único problema agora é que a variável da sessão agora é permanente até a sessão é liberado fechando o navegador. Além disso, como posso exibir as páginas adjacentes ... como no Paginator Django no estilo Digg. Não consegui entender como implementar isso no meu código.
O código é o seguinte:
from django.core.paginator import Paginator, InvalidPage, EmptyPage
def paginate(request, object_list, paginate_by=10):
try:
if "per_page" in request.session:
per_page = request.session["per_page"]
else:
request.session["per_page"] = int(request.REQUEST['p'])
per_page = request.session["per_page"]
request.session.set_expiry(0)
except:
per_page = 10
paginator = Paginator(object_list, per_page)
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
try:
items = paginator.page(page)
except (EmptyPage, InvalidPage):
items = paginator.page(paginator.num_pages)
return items
Então, no meu modelo, tenho isso para renderizar os links de paginação:
<div class="pagination" align="center">
<span class="step-links">
{% if items.has_previous %}
<a href="?page={{ items.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ items.number }} of {{ items.paginator.num_pages }}
</span>
{% if items.has_next %}
<a href="?page={{ items.next_page_number }}">next</a>
{% endif %}
</span>
</div>
Solução
Você pode conseguir isso ativando sessões.
Eu recomendo ler o capítulo Sessões, usuários e registro no site do DjangoBook.
EDIT: Agora que você ativou as sessões, acho que o problema são os hiperlinks no modelo. Use um ampersa e para separar vários parâmetros em um URL, por exemplo
<a href="?p={{ request.session.per_page }}&page={{ items.next_page_number }}">next</a>
EDIT 2: Não tenho certeza se entendi qual é o problema com o vencimento da sessão. A linha que define a sessão para expirar quando o navegador fecha é request.session.set_expiry(0)
. Veja o Django Docs em Usando sessões em vista Se você quiser mudar isso.
Para fazer um paginador de estilo Digg, você precisa escrever uma função que pegue o número atual da página e o número total de páginas e retorne uma lista de números de página. Em seguida, no modelo, atravesse os números da página e construa links para as páginas.
Uma lista de listas de números de página permitiria dividir os números da página em grupos, por exemplo,
[[1,2], [20,21,22,23,24], [30,31]]