Pregunta

Actualmente estoy desarrollando una aplicación Django que hará uso de la técnica infame "paginación". Estoy tratando de averiguar cómo funciona el módulo django.core.paginator.

Tengo una aplicación con un modelo de preguntas. Enumeraré todas las preguntas que utilizan 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 muchos páginas hacen.

En realidad, hay dos cosas que quiero saber:

  1. ¿Cómo puedo hacer Django averiguar qué página de la cuestión se encuentra en?
  2. ¿Cómo voy a escribir mi plantilla para adecuadamente "destacado" la página visitada actualmente?

Edit: Lo siento, se me olvidó parte de esta pregunta. También me gustaría cualquier página excepto por el actual sea un enlace a /questions/{{ that_page.start_index }}. Así que básicamente cada vínculo uniría a la primera pregunta en esa página.

¿Fue útil?

Solución

Hmm ... Veo en su comentario de que usted no quiere hacer el 'parámetro GET ol, que es lo que django.core.paginator fue escrito para el uso. Para hacer lo que quiera, puedo pensar en una mejor manera de calcular previamente la página que cada pregunta está encendido. A modo de ejemplo, la vista va a terminar siendo algo 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 })

Para 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 elementos, tendrá dos object_lists diferentes de trabajar con el ...

page.object_list

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

page.paginator.object_list

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

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

Otros consejos

Django, al menos de la versión 1.2, nos permite completar este tarea mediante el uso de etiquetas de plantilla de paginación por defecto puros.

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

Donde 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)

django-paginación debe hacer lo que quiere y viene envuelto en un paquete bonito que sólo puede plug-in y utilizar. En esencia, se mueve el código desde su punto de vista a las plantillas y un middleware.

EDIT: acabo de ver tu edición. Usted puede obtener los objetos actuales en una página utilizando {% autopaginate object_list %}, que sustituye object_list con los objetos actuales para una determinada página. Se puede recorrer y si desea que la primera, debe ser capaz de tratarla 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 la 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 esto, usted debe ser capaz de hacer todo lo necesario. Hay un par de buenos ejemplos aquí .

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