Comment utiliser la pagination avec Django 1.3?
La documentation n'est pas très claire à ce sujet.
Qu'est-ce qui va à mon
views.py
?Qu'est-ce qui va à mon modèle?
Que contient mon fichier URLconf?
Je pense que vous demandez des informations sur l'utilisation de la pagination avec les nouvelles vues basées sur les classes car, avec les vues basées sur les fonctions traditionnelles, elles sont faciles à trouver. J'ai trouvé que le simple réglage de la paginate_by
variable suffit à activer la pagination. Voir dans les vues génériques basées sur les classes .
Par exemple, dans votre 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 !!
Dans votre modèle ( car_list.html
), vous pouvez inclure une section de pagination comme celui - ci (nous avons quelques variables de contexte disponibles: is_paginated
, page_obj
et 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.** .... #}
La page à afficher est indiquée par un paramètre GET, simplement en ajoutant ?page=n
, à l'URL.
Supposons que j'ai une classe dans app / models.py nommée
FileExam(models.Model)
:app / models.py
app / views.py
Seulement un petit changement dans le
get_context_data
code de pagination et ajouté de la documentation de django iciapp / templates / app / exam_list.html
liste de contenu normal
section paginer
app / urls.py
la source
context = super(SoalListView, self)...
. Vouliez-vous direcontext = super(FileExamListView, self)...
:?Nous avons 2 méthodes pour le faire.
Le premier est simple et définit simplement le champ de classe
paginate_by
. Nous n'avons rien à voir avec laget_context_data
méthode.La deuxième méthode est un peu compliquée mais nous pouvons mieux comprendre la pagination et personnaliser une pagination complexe ou plusieurs paginations. Voyons ça.
Cela peut être fait en trois étapes.
1.Override
get_context_data
méthode de votreView
.Passez
page_keys
etpages
pour que nous puissions itérer les listes et éviter le codage en dur.2. Personnalisez votre sous-marin
template
.Nous définissons certaines variables afin de pouvoir parcourir la liste de pagination.
pagination.html
3. personnaliser l'extérieur
template
.index.html
la source