Pregunta

Estoy usando este código para mi paginación, y me gustaría que la opción del usuario sea persistente en todo el sitio (esto se ha solucionado hasta ahora) ... el único problema ahora es que la variable de sesión ahora es permanente hasta que la sesión se borre cerrando el navegador. Además, ¿cómo puedo obtener las páginas adyacentes mostradas ... como en el paginador de Django estilo digg? No he podido entender cómo implementar esto en mi código.

El código es el siguiente:

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

Luego, en mi plantilla tengo esto para renderizar los enlaces de paginación:

<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>
¿Fue útil?

Solución

Puedes lograr esto habilitando sesiones.

Recomiendo leer el capítulo Sesiones, Usuarios y Registro en la Sitio web de djangobook.


Editar: ahora que ha habilitado las sesiones, creo que el problema son los hipervínculos en la plantilla. Utilice un símbolo comercial para separar varios parámetros en una URL, por ejemplo,

 <a href="?p={{ request.session.per_page }}&page={{ items.next_page_number }}">next</a> 

Edit 2: No estoy seguro si entiendo cuál es el problema con el vencimiento de la sesión. La línea que establece que la sesión caduque cuando se cierra el navegador es request.session.set_expiry (0) . Consulte los documentos de django en Uso de sesiones en vistas si quieres cambiar eso.

Para hacer un paginador de estilo Digg, debe escribir una función que tome el número de página actual y el número total de páginas, y devuelva una lista de números de página. Luego, en la plantilla, recorre los números de página y construye enlaces a las páginas.

Una lista de listas de números de página le permitiría dividir los números de página en grupos, por ejemplo,

[[1,2], [20,21,22,23,24], [30,31]]

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top