Quando inizi ad aggiungere contenuti al tuo blog, ti accorgerai presto che devi dividere la lista dei post su diverse pagine. Django ha una classe di impaginazione che ti consente di gestire facilmente i dati impaginati.
Modificare il file views.py dell'applicazione blog per importare le classi di paginator Django e modificare la vista post_list, come seguente:
# blog/views.py
from django.core.paginator import (
Paginator, EmptyPage,
PageNotAnInteger
)
def post_list(request):
object_list = Post.published.all()
paginator = Paginator(object_list, 2) # 2 posts in each page
page = request.GET.get('page')
try:
posts = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer deliver the first page
posts = paginator.page(1)
except EmptyPage:
# If page is out of range deliver last page of results
posts = paginator.page(paginator.num_pages)
return render(request,
'blog/post_list.html',
{'page': page,
'posts': posts})
Ecco come funziona l'impaginazione:
Ora dobbiamo creare un template per visualizzare l'impaginatore in modo che possa essere incluso in qualsiasi template che utilizza l'impaginazione. Nella cartella templates/ dell'applicazione blog, crea un nuovo file e chiamalo pagination.html. Aggiungi il seguente codice HTML al file:
<!-- blog/templates/pagination.html -->
<div class="pagination">
<span class="step-links">
{% if page.has_previous %}
<a href="?page={{ page.previous_page_number }}">Previous</a>
{% endif %}
<span class="current">
Page {{ page.number }} of {{ page.paginator.num_pages }}.
</span>
{% if page.has_next %}
<a href="?page={{ page.next_page_number }}">Next</a>
{% endif %}
</span>
</div>
Il template d'impaginazione prevede un oggetto Page per renderizzare dei collegamenti precedenti e successivi e per visualizzare la pagina corrente e le pagine totali dei risultati. Torniamo al template blog/post_list.html e includiamo il template pagination.html nella parte inferiore del blocco {% content %}, come seguente:
<!-- blog/templates/blog/post_list.html -->
{% block content %}
...
{% include "pagination.html" with page=posts %}
{% endblock %}
Dal momento che l'oggetto Page che stiamo passando al template è chiamato post, includiamo il template d'impaginazione nel template di lista del post, passando i parametri per renderizzarlo correttamente. È possibile seguire questo metodo per riutilizzare il template d'impaginazione in viste impaginate di diversi modelli.
Ora visita http://127.0.0.1:8000/blog/ nel tuo browser. Dovresti vedere l'impaginazione in fondo alla lista dei post e dovresti essere in grado di navigare tra le pagine:
Per ora è tutto. Spero che in futuro sarò in grado di aggiungere funzionalità più utili a questo tutorial.
Puoi scaricare il codice sorgente di questo tutorial - Github repo.
Se ti piace il mio contenuto, supportami! grazie.