Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Paginación con python/django y html

Estas en el tema de Paginación con python/django y html en el foro de Python en Foros del Web. Hola como va, tengo el siguiente problema, tengo que paginar por ejemplo "socios" de un sitio, por ejemplo tengo que mostrar 10 por pagina, y ...
  #1 (permalink)  
Antiguo 27/06/2013, 13:17
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 10 meses
Puntos: 1
Paginación con python/django y html

Hola como va, tengo el siguiente problema, tengo que paginar por ejemplo "socios" de un sitio, por ejemplo tengo que mostrar 10 por pagina, y debo mostrar el indice como maximo con 10 paginas, estoy haciendo todo esto correctamente con el codigo que voy a pegar ahora despues, el problema esta en cuando supero las 10 paginas como hago para mover el indice por ejemplo si estoy parado en la pagina 6, que me muestre como inicio la 2 y como final la 11, se entiende?
Pego el codigo que tengo:

en la views tengo la vista de socios:

Código Python:
Ver original
  1. def socios(request):
  2.     copia = {}
  3.     sociosAux = Socio.objects.all().order_by("nombre")[:10]    
  4.     socios = []
  5.     for s in sociosAux:
  6.         soc = {'id':s.id, 'nombre':s.nombre, 'logo':str(s.logo).replace("\\","/"), 'rubro':str(s.rubro),\ 'direccion':s.direccion, 'telefono':s.telefono, 'web':s.web, 'mail':s.mail}        
  7.         socios.append(soc)  
  8.    
  9.     socios_per_page = 10
  10.    
  11.     cant_socios = len ( Socio.objects.all() )        
  12.     cant_pages = math.ceil( float(cant_socios)  /  float( socios_per_page ) )
  13.  
  14.     total_pages_mostrar = 10
  15.    
  16.     if cant_pages > total_pages_mostrar:
  17.         copia['cant_pages_nums'] = range( 1, total_pages_mostrar + 1 )
  18.     else:
  19.         copia['cant_pages_nums'] = range( 1, int( cant_pages )+1 )
  20.        
  21.     copia['socios'] = socios
  22.     copia['cant_pages'] = int( cant_pages )    
  23.     copia['cantidad_socios'] = cant_socios
  24.     return render_to_response("socios.html",copia)


en socios.html tengo esto:

Código HTML:
Ver original
  1. {% if cant_pages > 1 %}
  2.             <div class="paginacion">
  3.                 <ul>
  4.                 {% for i in cant_pages_nums %}
  5.                     {% if i == 1 %}          
  6.                         <li><a class="num_page activo" data-id="{{i}}" href="#">{{i}}</a></li>
  7.                     {% else %}
  8.                         <li><a class="num_page" data-id="{{i}}" href="#">{{i}}</a></li>
  9.                     {% endif %}
  10.                 {% endfor %}
  11.                   <!--<li class="ultimo"><a href="#">Fin</a></li>-->
  12.                 </ul>  
  13.             </div> <!--termina paginacion-->
  14.         {% endif %}

en el document.ready de socios.html tengo esto:
Código Javascript:
Ver original
  1. //PAGINAR SOCIOS
  2.     $(".num_page").on("click", function(e){    
  3.         e.preventDefault();
  4.                
  5.         //ESTILO A PAGINACION      
  6.         $(".num_page").each(function(){
  7.              $(this).removeClass( "activo" );
  8.         });    
  9.         //$(this).addClass( "activo" );    
  10.         var id = $(this).attr("data-id");
  11.         $("a.num_page[data-id ="+ id+"]").addClass("activo");
  12.        
  13.         var toData = {         
  14.             'page' : $(this).attr("data-id")
  15.             };     
  16.                
  17.         $.ajax({
  18.                 type: "GET",
  19.                 url: "/iab/paginar-socios",
  20.                 data: toData,              
  21.         }).done(function( msg ) {
  22.                 $("#contSocios").html(msg);
  23.             });            
  24.    
  25.     });//termina .num_page.click

Por ahora funciona bien la paginacion, pero quiero limitar la cantidad de paginas a mostrar en el indice, y a medida que se vaya moviendo, que vaya cambiando el indice...

Espero alguna sugerencia, gracias.
  #2 (permalink)  
Antiguo 27/06/2013, 14:17
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: Paginación con python/django y html

Este tema ha sido discutido bastante.

Por ejemplo algunos temas:
http://www.forosdelweb.com/f130/pagi...range-1019299/
http://www.forosdelweb.com/f130/pagi...odelo-1032719/

Un repo personal:
https://github.com/razpeitia/Django-Paginator-Example

Hay un repo con ejemplos simples entre ellos paginación:
https://github.com/fdw-contrib/django-ejemplos
  #3 (permalink)  
Antiguo 27/06/2013, 15:29
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 10 meses
Puntos: 1
Respuesta: Paginación con python/django y html

Gracias por el aporte, justo lo resolvi antes de leer tu ayuda, dejo mi solución. Lo hice mediante js simplemente cambiando el indice a medida que me iba moviendo, el resto de traer los datos con ajax ya lo tenia hecho. El valor de cant_pages lo cargo en un div oculto porque no sabia como acceder a un dato devuelto desde django desde javascript.
Código HTML:
Ver original
  1. <div id="cant_pages" data-num="{{cant_pages}}" style="display:none;"></div>

Código Javascript:
Ver original
  1. //PAGINAR SOCIOS
  2.     $("body").on("click",".num_page", function(e){     
  3.         e.preventDefault();
  4.        
  5.     var total = $("#cant_pages").attr("data-num");
  6.     var current = parseInt( $(this).attr("data-id") );
  7.     var adj = 2; //cantidad paginas a mostrar adjacentes del actual.
  8.     var inicio ="";
  9.     var fin = "";
  10.     var html ="";
  11.    
  12.     if ( (current - adj) < 1 && total < 5 ){
  13.          inicio = 1;
  14.          fin = total;    
  15.     }
  16.     else if ( (current - adj) < 1 && total > 5 ){
  17.          inicio = 1;
  18.          fin = 5;        
  19.     }
  20.     else if ( (current + adj) > total ){
  21.         fin = total;
  22.         current = current - ( (current+adj) - total );
  23.         inicio = current - adj;
  24.     }
  25.     else{
  26.         inicio = current - adj;
  27.         fin = current + adj;
  28.     }  
  29.  
  30.     if (inicio != 1){
  31.         html+='<li><a class="num_page" data-id="1" href="#"><|</a></li>';
  32.     }
  33.    
  34.     for (var i= inicio; i <= fin; i++){
  35.        
  36.         if (i == current){
  37.             html+='<li><a class="num_page activo" data-id="'+i+'" href="#">'+i+'</a></li>';
  38.         }else{         
  39.             html+='<li><a class="num_page" data-id="'+i+'" href="#">'+i+'</a></li>';
  40.         }      
  41.     }
  42.     if (fin != total){
  43.         html+='<li><a class="num_page" data-id="'+total+'" href="#">|></a></li>';
  44.     }
  45.     $(".pag").html(html);

Etiquetas: ajax, html
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:43.