2009-04-14 25 views
9

Actualmente estoy desarrollando una aplicación Django que utilizará la infame técnica de "paginación". Estoy intentando descubrir cómo funciona el módulo django.core.paginator.Paginación Django y "página actual"

Tengo una aplicación con un modelo de pregunta. Voy a enumerar todas las preguntas usando este paginador. Habrá 20 preguntas por página.

def show_question(question_pk): 
    questions = Question.objects.all() 
    paginator = Paginator(questions, 20) 
    page  = ... # Somehow figure out which page the question is on 
    return render_to_response('show_question.html', { 'page' : page }) 

En la vista, donde enumero las diferentes páginas como "... 2, 3, 4 , 5, 6, ..." Quiero destacar la página actual de alguna manera, al igual que muchas páginas hacer.

En realidad, hay dos cosas que quiero saber:

  1. ¿Cómo hago Django averiguar qué página de la cuestión se encuentra en?
  2. ¿Cómo escribiría mi plantilla para "resaltar" correctamente la página visitada actualmente?

EDIT: Lo siento, olvidé una parte de esta pregunta. También me gustaría que cualquier página, excepto la actual, sea un enlace al /questions/{{ that_page.start_index }}. Entonces, básicamente, cada enlace de página se vincularía a la primera pregunta en esa página.

+0

¿Qué quiere decir que desea todas las páginas excepto la corriente para enlazar a la pregunta en esa página? ¿Cómo cambiará el usuario las páginas? –

+0

No quiero pasar ningún parámetro de solicitud? Page = 4 GET ni nada. Solo usaré/question/4 para la pregunta 4, y luego la vista determinará en qué página está la pregunta. Esta es la razón por la que los enlaces de la página están realmente dirigidos a preguntas. –

+0

¿No cambiaría la primera pregunta en una página a medida que se agregan más preguntas o, posiblemente, se clasifican? Desde una perspectiva REST/HTTP, esto significa que la URL no se refiere a un recurso real. Es por eso que Django usa un parámetro GET: para anotar las características de visualización del recurso que identifica la URL. –

Respuesta

7

Hmm ... Veo en su comentario que no desea hacer el parámetro ol 'GET, que es para lo que se escribió django.core.paginator. Para hacer lo que quiere, no puedo pensar en otra manera mejor que precomputar la página en la que está cada pregunta. A modo de ejemplo, la vista va a terminar siendo algo así como:

ITEMS_PER_PAGE = 20 
def show_question(question_pk): 
    questions = Question.objects.all() 
    for index, question in enumerate(questions): 
     question.page = ((index - 1)/ITEMS_PER_PAGE) + 1 
    paginator = Paginator(questions, ITEMS_PER_PAGE) 
    page = paginator.page(questions.get(pk=question_pk).page) 
    return render_to_response('show_question.html', { 'page' : page }) 

Destacar la página actual en la plantilla, que harías algo así como

{% for i in page.paginator.page_range %} 
    {% ifequal i page.number %} 
     <!-- Do something special for this page --> 
    {% else %} 
     <!-- All the other pages --> 
    {% endifequal %} 
{% endfor %} 

En cuanto a los artículos, se le tener dos object_lists diferentes para trabajar con ...

page.object_list 

serán los objetos de la página actual y

page.paginator.object_list 

habrá todos los objetos, independientemente de la página. Cada uno de esos elementos tendrá una variable de "página" que le dirá en qué página están.

Dicho todo esto, lo que haces suena poco convencional. Es posible que desee volver a pensar, pero de cualquier manera, buena suerte.

+0

Oh chico, oh chico! 'page.paginator.object_list [i] .page' parece que es exactamente lo que estaba buscando. Lo veré de inmediato. ¡Gracias! –

5

django-pagination debe hacer lo que quiera y viene envuelto en un paquete bonito que puede simplemente enchufar y usar. Básicamente mueve el código de sus vistas a las plantillas y un middleware.

EDIT: Acabo de ver su edición. Puede obtener los objetos actuales en una página usando {% autopaginate object_list %}, que reemplaza object_list con los objetos actuales para cualquier página dada. Puede recorrerlo y si quiere el primero, debería poder tratarlo como una lista y hacer object_list[0].

Si desea mantener esto dentro de sus puntos de vista, se podría hacer algo como esto:

def show_question(question_pk): 
    questions = Question.objects.all() 
    paginator = Paginator(questions, 20) 
    return render_to_response('show_question.html', { 'page' : paginator }) 

Dentro de su plantilla, puede acceder a la página actual que está en haciendo:

# Gives you the starting index for that page. 
# For example, 5 objects, and you're on the second page. 
# start_index will be 3. 
page.start_index 

# You can access the current page number with: 
# 1-based index 
page.number 

Con eso, deberías poder hacer todo lo que necesites. Hay un par de buenos ejemplos here.

+0

Gracias por su comentario. Sin embargo, para mí parece que django-pagination no hace nada más que el material de paginación incorporado, sino que simplemente mueve la lógica del código a las plantillas y un middleware. ¿Es tan? –

+0

Esencialmente, sí. Actualicé mi respuesta si desea mantener su inicio de sesión de paginación dentro de su vista. –

10

Django, at least de la versión 1.2, nos permite completar esta tarea mediante el uso de etiquetas de plantilla de paginación predeterminadas puras.

{% for page in article_list.paginator.page_range %} 
    {% if page == article_list.number %} 
    {{ page }} 
    {% else %} 
    <a href="/page{{ page }}">{{ page }}</a> 
    {% endif %} 
{% endfor %} 

Dónde article_list es instancia de

paginator = Paginator(article_list, 20) 
    try: 
     article_list = paginator.page(int(page)) 
    except (EmptyPage, InvalidPage): 
     article_list = paginator.page(paginator.num_pages) 
+0

+1 maravilloso ... ¿es posible escribir stackoverflow como paginación (es decir: 'prev 1 ... 7 8 9 10 11 ... 500435 next'). me refiero al '...' – suhailvs

+0

@suhail, sí, es posible hacerlo, simplemente modifique la plantilla usando [sintaxis de la plantilla django] (https://docs.djangoproject.com/en/dev/ref/templates/builtins /). Pero preferiría recomendarle que pruebe la aplicación [django-interminable-paginación] (http://django-endless-pagination.readthedocs.org/en/latest/). Es simple de configurar y tiene valores predeterminados sanos para todo tipo de estilos de paginación. –

Cuestiones relacionadas