Creare un applicazione blog con django, parte 7: aggiungere impaginazione nel blog django

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:

  • Istanziamo la classe Paginator con il numero di oggetti che vogliamo visualizzare su ogni pagina.
  • Otteniamo il parametro page GET che indica il numero di pagina corrente.
  • Otteniamo gli oggetti per la pagina desiderata chiamando il metodo page() di Paginator.
  • Se il parametro page non è un numero intero, recuperiamo la prima pagina di risultati. Se questo parametro è un numero superiore all'ultima pagina di risultati, recupereremo l'ultima pagina.
  • Passiamo il numero di pagina e gli oggetti recuperati al template.

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:

Responsive image

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.

Post correlati