Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Problemas con queryset y paginacion

Estas en el tema de Problemas con queryset y paginacion en el foro de Python en Foros del Web. Hola a todos. Estoy desarrollando un proyecto personal con django y es mi primer app con este fremework. La aplicacion tiene varios modelos y formularios ...
  #1 (permalink)  
Antiguo 12/01/2016, 16:24
 
Fecha de Ingreso: enero-2016
Mensajes: 3
Antigüedad: 8 años, 10 meses
Puntos: 0
Pregunta Problemas con queryset y paginacion

Hola a todos. Estoy desarrollando un proyecto personal con django y es mi primer app con este fremework.
La aplicacion tiene varios modelos y formularios de busqueda. Con los campos de busqueda en los que simplemente uso un campo no tengo problemas, mi problema esta en un formulario que he creado para hacer una busqueda mas precisa en los que filtro campo por campo en un rango de fechas determinado.Cuando lo relleno y le doy a buscar me devuelve la consulta perfectamente como yo quiero pero cuando le doy a pagina siguiente es cuando tengo el problema. Si la busqueda en la barra de direcciones es por ejemplo:

http://127.0.0.1:8000/buscar/?q1=lomas&q2=Averia&q3=154&q4=&fecha_inicial=2016-01-01&fecha_final=2016-01-31

Ahora la pagina 2 seria:

http://127.0.0.1:8000/buscar/?pagina2=q1=lomas&q2=Averia&q3=154&q4=&fecha_inici al=2016-01-01&fecha_final=2016-01-31

Y se me queda asi:

http://127.0.0.1:8000/buscar/?pagina2

Ya no me incluye la busqueda y no puede visualizar el resto de paginas. En el formulario que tengo de un solo input me funciona correctamente la paginacion pero aqui le he dado mil vueltas y no lo consigo.

Esta es mi view:

Código Python:
Ver original
  1. @login_required
  2. def buscar(request):
  3.     errors = []
  4.     if request.method == 'GET':
  5.         if not request.GET.get('fecha_inicial', '') or not request.GET.get('fecha_final', ''):
  6.             errors.append('por favor introduce fecha inicio y fecha fin ambas son requeridas.')
  7.         else:
  8.             q1 = request.GET.get('q1', '')
  9.             q2 = request.GET.get('q2', '')
  10.             q3 = request.GET.get('q3', '')
  11.             q4 = request.GET.get('q4', '')
  12.             fecha_inicial = request.GET.get('fecha_inicial', '')
  13.             fecha_final = request.GET.get('fecha_final', '')
  14.             qs1 = incidencias.objects.filter(Parque__icontains=q1)
  15.             qs2 = qs1.filter(Tipo__icontains=q2)
  16.             qs3 = qs2.filter(Fallo__icontains=q3)
  17.             qs4 = qs3.filter(Intervencion__icontains=q4)
  18.             q = qs4.filter(Fecha__range=(fecha_inicial, fecha_final))
  19.             queryset_list = q
  20.             paginator = Paginator(queryset_list, 20)
  21.  
  22.             page = request.GET.get('pagina')
  23.             try:
  24.                 queryset = paginator.page(page)
  25.             except PageNotAnInteger:
  26.                
  27.                 queryset = paginator.page(1)
  28.             except EmptyPage:
  29.                
  30.                 queryset = paginator.page(paginator.num_pages)
  31.  
  32.             context = {
  33.                 "objetc_list": queryset,
  34.                 "parte": "Lista",
  35.             }
  36.             return render(request, 'partes.html', context)
  37.         return render(request, 'formulario.html',
  38.         {'errors': errors})

Última edición por eibi76; 13/01/2016 a las 07:34
  #2 (permalink)  
Antiguo 14/01/2016, 15:30
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Problemas con queryset y paginacion

Cuando generas el link de siguiente le tienes que añadir el no solo el query string de la sig pagina en este caso "?pagina=2" si no tambien todo tu querystring actual.

Fuente: http://stackoverflow.com/questions/6...jango-template
  #3 (permalink)  
Antiguo 15/01/2016, 06:47
 
Fecha de Ingreso: enero-2016
Mensajes: 3
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: Problemas con queryset y paginacion

Muchas gracias por la respuesta. Despues de dos dias por fin con esto consigo pasar a la pagina siguiente incluyendo la busqueda. El problema que tengo ahora es que cuando voy a pagina 3 me sale concatenada "&pagina=2" tambien y la query desordenada.

El paginador lo tengo asi:

Código Python:
Ver original
  1. <ul class="pagination">
  2.     {% if objetc_list.has_previous %}
  3.     <li class="waves-effect"><a href="?pagina={{ objetc_list.previous_page_number }}&{{ request.GET.urlencode }}"><i class="material-icons">chevron_left</i></a></li>
  4.     {% endif %}
  5.    
  6.         <span class="current">Pagina {{ objetc_list.number }} de {{ objetc_list.paginator.num_pages }}</span>
  7.  
  8.     {% if objetc_list.has_next %}
  9.     <li class="waves-effect"><a href="?pagina={{ objetc_list.next_page_number }}&{{ request.GET.urlencode }}"><i class="material-icons">chevron_right</i></a></li>
  10.     {% endif %}
  11.   </ul>

Última edición por eibi76; 15/01/2016 a las 09:43
  #4 (permalink)  
Antiguo 15/01/2016, 12:03
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Problemas con queryset y paginacion

Bueno el orden no importa, pero si, lo que pasa es que en la primera pagina no envías ningún parámetro y asumes que es la pagina 1.

Cuando te mueves a la pagina 2, ahora pagina=2 es parte del querystring.

Y cuando te mueves a la pagina 3, le concatenas la pagina=3 y también la pagina=2
Ahí tienes que manipular el querystring para que te aparezca lo que tu quieras. Y si esa manipulación la haces en la vista.
  #5 (permalink)  
Antiguo 16/01/2016, 10:10
 
Fecha de Ingreso: enero-2016
Mensajes: 3
Antigüedad: 8 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Problemas con queryset y paginacion

Bueno pues el tema esta solucionado. Adjunto la vista y la paginacon del template para que pueda servirle a alguien en un futuro.

Las vista:

Código Python:
Ver original
  1. def buscar(request):
  2. errors = []
  3. if request.method == 'GET':
  4.     if not request.GET.get('fecha_inicial', '') or not request.GET.get('fecha_final', ''):
  5.         errors.append('Por favor introduce fecha inicio y fecha fin ambas son requeridas.')
  6.     else:
  7.         parque = request.GET.get('parque', '')
  8.         tipo = request.GET.get('tipo', '')
  9.         maquina = request.GET.get('maquina', '')
  10.         fallo = request.GET.get('fallo', '')
  11.         intervencion = request.GET.get('intervencion', '')
  12.         fecha_inicial = request.GET.get('fecha_inicial', '')
  13.         fecha_final = request.GET.get('fecha_final', '')
  14.         q1 = incidencias.objects.filter(Parque__icontains=parque)
  15.         q2 = q1.filter(Tipo__icontains=tipo)
  16.         q3 = q2.filter(Maquina__icontains=maquina)
  17.         q4 = q3.filter(Fallo__icontains=fallo)
  18.         q5 = q4.filter(Intervencion__icontains=intervencion)
  19.         queryset_list = q5.filter(Fecha__range=(fecha_inicial, fecha_final))
  20.  
  21.         paginator = Paginator(queryset_list, 4)
  22.  
  23.         parametros = request.GET.copy()
  24.         if parametros.has_key('pagina'):
  25.             del parametros['pagina']
  26.  
  27.         page = request.GET.get('pagina')
  28.         try:
  29.             queryset = paginator.page(page)
  30.         except PageNotAnInteger:
  31.  
  32.             queryset = paginator.page(1)
  33.         except EmptyPage:
  34.  
  35.             queryset = paginator.page(paginator.num_pages)
  36.  
  37.         context = {
  38.             "objetc_list": queryset,
  39.             "parametros": parametros,
  40.         }
  41.         return render(request, 'partes.html', context)
  42.     return render(request, 'formulario.html',
  43.     {'errors': errors})

Y el template:

Código HTML:
<ul class="pagination">
{% if objetc_list.has_previous %}
<li class="waves-effect"><a href="?pagina={{ objetc_list.previous_page_number }}{% if parametros.urlencode %}&{{ parametros.urlencode }}{% endif %}"><i class="material-icons">chevron_left</i></a></li>
{% endif %}

    <span class="current">Pagina {{ objetc_list.number }} de {{ objetc_list.paginator.num_pages }}</span>

{% if objetc_list.has_next %}
<li class="waves-effect"><a href="?pagina={{ objetc_list.next_page_number }}{% if parametros.urlencode %}&{{ parametros.urlencode }}{% endif %}"><i class="material-icons">chevron_right</i></a></li>
{% endif %}
Gracias razpeitia

Etiquetas: django, query
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 11:34.