Cuando te enfrentas a numerar las páginas o paginar una relación o lista , buscando un mejor acceso, a partir de código HTML, deberías darle unas cuantas vueltas y observar cómo lo hacen los mejores.
Existen tres formas de paginar una relación :
- Paginacion tradicional, dividiendo la relación en grupos de 10, 25, 50 o cualquier cantidad de registros a mostrar. Y al final se incluyen enlaces para avanzar y retroceder página a página.
- Cargar más, emplea AJAX para añadir contenido a petición, pulsando un botón.
- Scroll infinito, la página web crece con solo bajar el ratón, también se carga mediante AJAX pero sin hacer ningún click con el ratón.
En los últimos dos casos, crean páginas monstruosas de difícil navegación con el ratón o mediante los botones del navegador, además de no estar recomendado para acceder con dispositivos de lectura automática ( WAI-ARIA ), por tanto no serán objeto de este artículo.
Para la primera opción existen muchas variantes que vamos a explorar.
Cómo paginar como GOOGLE :
GMAIL :
AMAZON:
ALEXA
EBAY
20 MINUTOS
Buscando la mejor solución
- Botones ANTERIOR y SIGUIENTE en forma de icono.- Lista numerada con indicación del total de páginas, con la indicación de posición actual y de cuantos items contiene cada página.
- Mostar una relación limitada al espacio disponible o inferior.
- Botones con tamaño adecuado para todos los dispositivos y recuadros visibles. Esto es crítico para la navegación con dispositivos móviles.
Los ejemplos anteriores tienen años de experiencia y probablemente hayan empleado infinidad de recursos hasta llegar a su estado. Partiendo de este punto, vamos a crear con código PYTHON, un resultado HTML dinámico, en función de los parámetros.
Código paginación
Los parámetros que emplearemos : pagina_actual, total_registros y registros_por_paginaRegistros totales : items
Registros por página : items4page
Página actual : page
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def pagination(items=0,items4page=20,page=1):__name__ = "pagination.pagination"
LOG = logging.getLogger(__name__)
sys.stdout = sys.stderr
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
try:
total_pages = int(items/items4page) if items%items4page==0 else int(items/items4page)+1
page_list = []
if page==1:
#page_list.append(['❮',1,False])
page_list.append(['',1,False])
elif page>1:
#page_list.append(['❮',page-1,False])
page_list.append(['',page-1,False])
if page-1>0 and page
if page>2:
page_list.append([repr(1),1,False])
if page-2<>1:
page_list.append(['...',None,False])
if page-1>0:
page_list.append([repr(page-1),page-1,False])
page_list.append([repr(page),page,True])
if total_pages>=page+1:
page_list.append([repr(page+1),page+1,False])
if page
if page+2<>total_pages:
page_list.append(['...',None,False])
page_list.append([repr(total_pages),total_pages,False])
if page-1==0:
page_list.append([repr(page),page,True])
if total_pages>=page+1:
page_list.append([repr(page+1),page+1,False])
if total_pages>=page+2:
page_list.append([repr(page+2),page+2,False])
page_list.append(['...',None,False])
if total_pages>=page+3:
page_list.append([repr(total_pages),total_pages,False])
if page>=total_pages and page>1:
if page-3>0:
page_list.append([repr(1),1,False])
if page-2>0:
page_list.append(['...',None,False])
page_list.append([repr(page-2),page-2,False])
if page-1>0:
page_list.append([repr(page-1),page-1,False])
page_list.append([repr(page),page,True])
if page==total_pages:
#page_list.append(['❯',total_pages,False])
page_list.append(['',total_pages,False])
elif page
#page_list.append(['❯',page+1,False])
page_list.append(['',page+1,False])
return page_list
except Exception as e:
tb = sys.exc_info()[2]
LOG.error(u"ERROR %s <%s> en linea %s !!!\n" % (__name__,repr(e),tb.tb_lineno))
def pagination2html(items=0,items4page=20,page=1,other=''):__name__ = "pagination2html"
LOG = logging.getLogger(__name__)
sys.stdout = sys.stderr
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
try:
page_list = list()
total_pages = int(items/items4page) if items%items4page==0 else int(items/items4page)+1
html_list = list()
if page<=0:
page=1
html_list.append(u'''
''')
if items>0 and total_pages>0:
page_list = pagination(items,items4page,page)
for n in page_list:
if n[1] is None:
html_list.append(u'''...''')
elif n[2]:
html_list.append(u'''%s''' % (n[1],total_pages,items4page,other,n[0]))
else:
html_list.append(u'''%s''' % (n[1],total_pages,items4page,other,n[0]))
html_list.append('''
''') return ''.join(html_list)
except Exception as e:
tb = sys.exc_info()[2]
LOG.error(u"ERROR %s <%s> en linea %s !!!\n" % (__name__,repr(e),tb.tb_lineno))
if __name__ == "__main__":
print(pagination2html(220,18,1))
print(pagination2html(220,18,12))
print(pagination2html(220,18,2))
print(pagination2html(220,18,3))
print(pagination2html(220,18,10))
print(pagination2html(220,18,11))
Y aquí puedes ver el resultado aplicando CSS al código HTML:
El código es muy accesible y modificable si deseas incorporar CSS.
Todo el código que se publica en PURO PYTHON, por sencillo que parezca, sufre pruebas de carga y su fín último es pasar a fase de producción, en este último estadio es posible volver a revisar errores que son subsanados e inmediatamente se corrige en su publicación, como ha sucedido en este caso.