Wie verwende ich die Paginierung mit Django 1.3?
Die Dokumentation ist dazu nicht sehr klar.
Was geht zu meinem
views.py
?Was geht zu meiner Vorlage?
Was geht zu meiner URLconf-Datei?
Ich denke, Sie fragen nach Informationen zur Verwendung der Paginierung mit den neuen klassenbasierten Ansichten, da diese mit herkömmlichen funktionsbasierten Ansichten leicht zu finden sind. Ich fand, dass nur durch Setzen der paginate_by
Variablen ausreicht, um die Paginierung zu aktivieren. Siehe in Klassenbasierte generische Ansichten .
Zum Beispiel in Ihrem views.py
:
import models
from django.views.generic import ListView
class CarListView(ListView):
model = models.Car # shorthand for setting queryset = models.Car.objects.all()
template_name = 'app/car_list.html' # optional (the default is app_name/modelNameInLowerCase_list.html; which will look into your templates folder for that path and file)
context_object_name = "car_list" #default is object_list as well as model's_verbose_name_list and/or model's_verbose_name_plural_list, if defined in the model's inner Meta class
paginate_by = 10 #and that's it !!
In Ihrer Vorlage ( car_list.html
) können Sie eine Paginierung Abschnitt wie folgt enthalten (wir einige Kontextvariablen zur Verfügung haben: is_paginated
, page_obj
, und paginator
).
{# .... **Normal content list, maybe a table** .... #}
{% if car_list %}
<table id="cars">
{% for car in car_list %}
<tr>
<td>{{ car.model }}</td>
<td>{{ car.year }}</td>
<td><a href="/car/{{ car.id }}/" class="see_detail">detail</a></td>
</tr>
{% endfor %}
</table>
{# .... **Now the pagination section** .... #}
{% if is_paginated %}
<div class="pagination">
<span class="page-links">
{% if page_obj.has_previous %}
<a href="/cars?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="page-current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="/cars?page={{ page_obj.next_page_number }}">next</a>
{% endif %}
</span>
</div>
{% endif %}
{% else %}
<h3>My Cars</h3>
<p>No cars found!!! :(</p>
{% endif %}
{# .... **More content, footer, etc.** .... #}
Die anzuzeigende Seite wird durch einen GET-Parameter angezeigt ?page=n
, der der URL einfach hinzugefügt wird.
Angenommen, ich habe eine Klasse in app / models.py mit dem Namen
FileExam(models.Model)
:app / models.py
app / views.py
nur eine kleine Änderung im
get_context_data
und hinzugefügten Paginierungscode aus der Django-Dokumentation hierapp / templates / app / exam_list.html
normale Inhaltsliste
paginieren Abschnitt
app / urls.py.
quelle
context = super(SoalListView, self)...
. Meinten Sie :context = super(FileExamListView, self)...
?Wir haben 2 Methoden, um dies zu tun.
Das erste ist einfach und setzt einfach das Klassenfeld
paginate_by
. Mit derget_context_data
Methode brauchen wir nichts zu tun .Die zweite Methode ist etwas kompliziert, aber wir können die Paginierung besser verstehen und die komplexe Paginierung oder mehrere Paginierungen anpassen. Mal sehen.
Dies kann in drei Schritten erfolgen.
1. Überschreiben Sie die
get_context_data
Methode IhresView
.Bestehen
page_keys
undpages
damit wir die Listen iterieren und Hardcodierung vermeiden können.2. Passen Sie Ihr Sub an
template
.Wir definieren einige Variablen, damit wir die Paginierungsliste durchlaufen können.
pagination.html
3. Außen anpassen
template
.index.html
quelle