Jak korzystać z paginacji w Django 1.3?
Dokumentacja na ten temat nie jest zbyt jasna.
Co idzie do mojego
views.py
?Co idzie do mojego szablonu?
Co idzie do mojego pliku URLconf?
Myślę, że pytasz o informacje na temat korzystania z paginacji w nowych widokach opartych na klasach, ponieważ przy tradycyjnych widokach opartych na funkcjach łatwo je znaleźć. Przekonałem się, że samo ustawienie paginate_by
zmiennej wystarczy, aby włączyć podział na strony. Zobacz w widokach ogólnych opartych na klasach .
Na przykład w 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 !!
W szablonie ( car_list.html
), można zawierać sekcję paginacji takiego (mamy pewne zmienne kontekstowe dostępne: is_paginated
, page_obj
, i 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.** .... #}
Wyświetlana strona jest wskazywana przez parametr GET, po prostu dodając ?page=n
do adresu URL.
Załóżmy, że mam klasę w app / models.py o nazwie
FileExam(models.Model)
:app / models.py
app / views.py
Tylko niewielka zmiana
get_context_data
i dodany kod stronicowania z dokumentacji django tutajapp / templates / app / egzamin_list.html
normalna lista zawartości
sekcja stronicowania
app / urls.py
źródło
context = super(SoalListView, self)...
. Czy miałeś na myślicontext = super(FileExamListView, self)...
:?Mamy na to 2 metody.
Pierwszy jest prosty i wystarczy ustawić pole klasy
paginate_by
. Nic nie musimy robić zget_context_data
metodą.Druga metoda jest nieco skomplikowana, ale możemy uzyskać więcej zrozumienia na temat stronicowania i dostosować złożoną lub kilka stronicowania. Zobaczmy.
Można to zrobić w trzech krokach.
1.Opakuj
get_context_data
swoją metodęView
.Przekazać
page_keys
ipages
tak, że możemy iteracyjne wykazy i uniknąć twarde kodowania.2. Dostosuj swój sub
template
.Definiujemy niektóre zmienne, abyśmy mogli iterować po liście stronicowania.
pagination.html
3. Dostosuj zewnętrzne
template
.index.html
źródło