Django Paginierung und „aktuelle Seite“
-
09-09-2019 - |
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:
- Wie mache ich Django herauszufinden, welche Seite die Frage befindet sich an?
- 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.
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 .