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>
Foi útil?

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]]

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top