Frage

Ich entwickle derzeit eine Django-Anwendung, die Verwendung der berüchtigten „Paginierung“ Technik machen. Ich versuche, herauszufinden, wie das django.core.paginator Modul funktioniert.

Ich habe eine Anwendung mit einer Frage-Modell. Ich werde alle Fragen mit diesem paginator wird auflistet. Es wird pro Seite 20 Fragen sein.

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

In der Ansicht, wo ich die verschiedenen Seiten auflisten, wie "... 2, 3, 4 , 5, 6, ..." Ich mag irgendwie die aktuelle Seite markieren, wie viele Seiten tun.

Es gibt wirklich zwei Dinge, die ich wissen will:

  1. Wie mache ich Django herauszufinden, welche Seite die Frage befindet sich an?
  2. Wie würde ich meine Vorlage richtig „Highlight“ die aktuell besuchten Seite schreiben?

EDIT: Sorry, ich Teil dieser Frage vergessen. Ich möchte auch jede Seite außer für die aktuelle ein Link zu /questions/{{ that_page.start_index }} zu sein. Also im Grunde jede Seite Link auf die erste Frage auf dieser Seite verbinden würde.

War es hilfreich?

Lösung

Hmm ... Ich sehe aus Ihrem Kommentar, die Sie wollen nicht den ol‘GET-Parameter zu tun, das, was django.core.paginator für die Verwendung geschrieben wurde. Zu tun, was Sie wollen, kann ich keinen besseren Weg vorstellen, als die Seite zu vorauszuberechnen, die jede Frage auf. Als Beispiel wird Ihre Ansicht nach oben, etwas wie am Ende:

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

Um die aktuelle Seite in der Vorlage zu markieren, dann würden Sie so etwas wie

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

Wie für die Elemente, haben Sie zwei verschiedene object_lists mit arbeiten ...

page.object_list

werden die Objekte in der aktuellen Seite und

page.paginator.object_list

werden alle Objekte, unabhängig von Seite sein. Jedes dieser Elemente wird eine „Seite“ Variable haben, die Ihnen sagen, welche Seite sie sind auf.

Das alles gesagt, was Sie tun, klingt unkonventionell. Sie können zu überdenken wollen, aber so oder so, viel Glück.

Andere Tipps

Django, mindestens ab Version 1.2, ermöglicht es uns, diese zu vervollständigen Aufgabe von reinem Standard Paginierung Template-Tags verwenden.

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

Wo article_list ist Instanz von

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

django-Paginierung tun sollten was Sie wollen, und kommt in einem hübschen Paket eingewickelt Sie nur Plug-in und verwenden können. Er bewegt sich im Wesentlichen den Code aus Ihrer Sicht auf die Vorlagen und eine Middleware.

EDIT: Ich sehe nur deine Bearbeitung. Sie können die aktuellen Objekte auf einer Seite mit {% autopaginate object_list %} erhalten, die mit den aktuellen Objekte für eine gegebene Seite object_list ersetzt. Sie können durch sie durchlaufen und wenn Sie die erste wollen, sollten Sie es zu behandeln wie eine Liste der Lage sein und tun object_list[0].

Wenn Sie dies in Ihren Ansichten halten möchten, können Sie etwas tun könnten:

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

In Ihrer Vorlage können Sie die aktuelle Seite zugreifen Sie sind auf, indem Sie:

# 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

Damit sollten Sie in der Lage sein, alles, was Sie tun müssen. Es gibt ein paar gute Beispiele hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top