Migliora l'efficienza e la scalabilità della tua applicazione Django implementando l'impaginazione. Ecco tutto ciò che devi sapere per iniziare.

L'impaginazione migliora l'esperienza dell'utente e le prestazioni dell'applicazione quando si tratta di set di dati di grandi dimensioni. Senza un sistema di impaginazione in atto, la tua applicazione subirà ritardi per la maggior parte del tempo. Con Django, puoi sfruttare il supporto integrato per l'impaginazione per impaginare la tua applicazione web.

Come funziona l'impaginazione in Django

L'implementazione dell'impaginazione in Django può variare a seconda che si lavori con viste basate su classi o funzioni. Indipendentemente dal metodo preferito, i principi di base rimangono gli stessi.

Django usa una classe chiamata Impaginatore per implementare l'impaginazione. IL Impaginatore class fornisce diversi metodi che puoi usare per personalizzare la tua impaginazione. Quando si inizializza il Impaginatore classe, prende due parametri obbligatori; i dati da impaginare e il numero di elementi da mostrare per pagina. IL

instagram viewer
Impaginatore accetta un terzo parametro facoltativo per gli orfani per specificare il numero minimo di elementi che dovrebbero rimanere nell'ultima pagina. Per impostazione predefinita, il valore di orphans è 0, il che significa che tutte le pagine hanno lo stesso numero di elementi.

L'URL per una pagina impaginata Django è simile a questo: https://example.com/products/?page=3. IL pagina parametro nell'URL dice a Django quale pagina l'utente vuole vedere. Aiuta anche Django a determinare quale parte dei dati visualizzare per quella pagina.

Il codice utilizzato in questo progetto è disponibile in a Deposito GitHub ed è gratuito per l'uso con la licenza MIT.

Imposta il tuo progetto Django per l'impaginazione

Prima di impaginare in Django, devi averlo installato Django e configurarlo sul tuo computer. Dopo aver configurato Django sul tuo computer, dovresti creare un'app e un modello per i tuoi dati. Ecco un semplice modello che puoi copiare:

da django.db importare Modelli

classeInviare(Modelli. Modello):

titolo = modelli. CharField (lunghezza_max=255)
autore = modelli. CharField (lunghezza_max=50)
contenuto = modelli. Campo di testo('Pubblica contenuto')

def__str__(se stesso):
ritorno auto.titolo

Il modello sopra è per un'applicazione blog. Definisce il titolo, l'autore e i campi del contenuto per ogni post del blog. Ha anche un metodo che restituisce il titolo del post per una migliore esperienza utente nel pannello di amministrazione.

Migra il tuo modello eseguendo questo comando:

python manage.py makemigrations && python manage.py migrate

Dopo aver migrato il tuo modello, dovresti andare a blog>admin.py per registrarlo. Il codice seguente registra correttamente un modello chiamato Inviare.

da django.contrib importare admin
da .Modelli importare Inviare # sostituisci 'Post' con il nome del tuo modello

admin.site.register (Posta)

Successivamente, crea un superutente e aggiungi post nel tuo pannello di amministrazione di Django. Per creare un superutente, usa questo comando:

python manage.py createsuperuser

Il comando sopra ti guiderà attraverso il processo illustrato nell'immagine qui sotto:

Dopo aver creato un superutente, esegui il tuo server di sviluppo e vai al pannello di amministrazione.

python manage.py esegue il server

Una volta avviato il server, vai a http://127.0.0.1:8000/admin, accedi e aggiungi alcuni post.

Quindi, crea un modello HTML per visualizzare i tuoi post sul browser. Crea il tuo file nella seguente directory: tua_app/templates/nome_tua_app/index.html. Se non capisci come creare modelli, leggi il nostro guida introduttiva all'architettura MVT di Django.

Impaginazione Django in una vista basata sulle funzioni

Django ti consente di creare applicazioni con viste basate su classi o viste basate su funzioni. Per impaginare l'applicazione utilizzando una vista basata sulle funzioni. Segui questi passi:

  • Apri i tuoi viste.py file e importare il file Impaginatore classe.
da django.core.impaginatore importare Impaginatore
  • Crea una funzione di visualizzazione per visualizzare i post nel tuo modello HTML.
da django.scorciatoie importare rendere
da .Modelli importare Inviare
da django.core.impaginatore importare Impaginatore

defvisualizzazione elenco(richiesta):
post = Post.objects.all()
ritorno rendere (richiesta, 'blog/blog_list_view.html', {'post':post})

  • Crea un pattern URL per mostrare i tuoi post nel browser. Inizia configurando il pattern URL nella directory del tuo progetto. Apri il URL.py file a livello di progetto e aggiungilo al file modelli URL:
da django.urls importare includere

schemi URL = [
...,
sentiero('', includere('blog.url')),
]

Nel frammento di codice sopra, sostituisci blog con il nome della tua app. Se non riesci a distinguere tra un progetto e un'app, dovresti saperlo come un progetto differisce da un'app in Django.

Dopo aver eseguito la configurazione di cui sopra, crea un file URL.py file nella directory dell'app (in questo caso, è il file blog cartella) e aggiungi questo snippet di codice:

da django.urls importare sentiero
da .visualizzazioni importare visualizzazione elenco

schemi URL = [
sentiero('', vista_elenco, nome='visualizzazione elenco'),
]

Quando esegui il tuo server e vai a http://127.0.0.1:8000/, il browser visualizzerà i tuoi post in base al foglio di stile specificato.

  • Modifica la tua funzione di visualizzazione per aggiungere la logica di impaginazione. Ecco un esempio:
defvisualizzazione elenco(richiesta):
post = Post.objects.all()
impaginato = impaginatore (post, 3)
numero_pagina = richiesta. GET.get('pagina') #Ottieni il numero di pagina richiesto dall'URL

pagina = paginated.get_page (numero_pagina)
ritorno rendere (richiesta, 'blog/blog_list_view.html', {'pagina':pagina})

Il suddetto frammento di codice introduce tre nuove variabili: impaginato, numero di pagina, E pagina. Ogni variabile esegue le seguenti operazioni:

  1. IL impaginato variabile inizializzata il Impaginatore classe. In questo scenario, i dati da impaginare sono il set di query, post, e ci vuole 3 come il numero di elementi da visualizzare per pagina.
  2. IL numero di pagina variabile ottiene il numero di pagina dall'URL. Ad esempio, dentro http://127.0.0.1:8000/?page=2, il numero di pagina è 2.
  3. IL pagina La variabile recupera la pagina specifica di cui eseguire il rendering dal file impaginato variabile.

Ormai Django deve aver impaginato la tua pagina. Puoi navigare verso pagine impaginate specifiche utilizzando il formato URL mostrato in questa immagine:

  • Modifica il modello HTML per visualizzare la navigazione per le pagine impaginate. Utilizzando i metodi disponibili in Impaginatore class ti consente di creare una navigazione semplice sulla tua pagina. Ecco un esempio che puoi aggiungere sotto il tuo codice HTML iniziale:
 {% if page.has_previous %}
<UNhref="?page={{page.previous_page_number}}"
class="btn btn-secondary mx-NN">PrecedenteUN>
{% finisci se %}

<UNhref="?pagina=1"classe="btn btn-secondario">PrimoUN>

{% per num in page.paginator.page_range %}
{% if num == pagina.numero %}
<span>{{ numero }}span>
{% altro %}
<UNhref="?pagina={{num}}"classe="btn btn-secondario mx-2">
{{ numero }}
UN>
{% finisci se %}
{% fine per %}

<UNhref="?page={{page.paginator.num_pages}}"classe="btn btn-secondario mx-2">
Scorso
UN>

{% if page.has_next %}
<UNhref="?page={{page.next_page_number}}"classe="btn btn-secondario mx-2">
Prossimo
UN>
{% finisci se %}

Nello snippet di codice precedente, i seguenti metodi vengono utilizzati insieme alle istruzioni condizionali per determinare l'aspetto della navigazione dell'impaginazione:

  1. ha_precedente: Questo metodo restituisce VERO se c'è una pagina precedente nei dati impaginati.
  2. numero_pagina_precedente: Questo metodo restituisce il valore della pagina precedente.
  3. intervallo di pagine: Questo metodo ti consente di sapere quante pagine hai nei tuoi dati impaginati.
  4. numero: Questo metodo restituisce il valore della pagina corrente.
  5. num_pagine: Questo metodo restituisce il numero totale di pagine.
  6. has_next: Questa funzione restituisce VERO se c'è una pagina successiva nei dati impaginati.
  7. numero_pagina_successiva: Questo metodo restituisce il valore della pagina successiva.

Impaginazione Django in una visualizzazione basata su classi

In una visualizzazione basata sulla classe, non è necessario importare e inizializzare il file Impaginatore classe. Per implementare l'impaginazione in una vista basata su classi, è necessario specificare un attributo chiamato paginate_da. Segui questi passaggi per impaginare la tua app con una visualizzazione basata su classi:

  • Scrivi una vista basata sulla classe e specifica il file paginate_da attributo. Ecco un semplice esempio:
da .Modelli importare Inviare
da django.views.generic importare Visualizzazione elenco

classePostListView(Visualizzazione elenco):
modello = Posta
nome_modello = 'blog/blog_list_view.html'
contesto_nome_oggetto = 'pagina'
paginate_by = 2

La vista sopra è la versione basata sulla classe della vista basata sulla funzione scritta in precedenza. Questa visione eredita quella di Django Visualizzazione elenco class, utilizzato per elencare gli elementi. Definisce la sua logica con attributi come modello, Nome modello, contesto_nome_oggetto, E paginate_da. IL paginate_da l'attributo determina quanti post visualizzare per pagina; in questo caso, 2 post.

  • Una volta creata la tua vista, modifica il tuo URL.py file per usarlo. Qui c'è un semplice esempio:
da .visualizzazioni importare PostListView

schemi URL = [
sentiero('', PostListView.as_view(), nome='visualizzazione elenco'),
]

  • Modifica il modello HTML da utilizzare page_obj per l'impaginazione.
 {% if page_obj.has_previous %}
<UNhref="?page={{page_obj.previous_page_number}}"
class="btn btn-secondary mx-NN">PrecedenteUN>
{% finisci se %}

<UNhref="?pagina=1"classe="btn btn-secondario">PrimoUN>

{% per num in page_obj.paginator.page_range %}
{% if num == page_obj.number %}
<spanclasse="pagina corrente">{{ numero }}span>
{% altro %}
<UNhref="?pagina={{num}}"classe="btn btn-secondario mx-2">
{{ numero }}
UN>
{% finisci se %}
{% fine per %}

<UNhref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-secondary mx-NN">
Scorso
UN>

{% if page.has_next %}
<UNhref="?page={{page_obj.next_page_number}}"
class="btn btn-secondary mx-NN">
Prossimo
UN>
{% finisci se %}

A differenza del modello HTML per la visualizzazione basata sulle funzioni, questo modello utilizza page_obj invece di pagina per rappresentare l'oggetto della pagina. Questo è il comportamento predefinito per l'impaginazione basata sulla classe in Django.

Usa l'impaginazione per rendere scalabile la tua applicazione

L'impaginazione riduce il carico sul tuo server/database recuperando e visualizzando sottoinsiemi di dati più piccoli alla volta. Con l'impaginazione, le prestazioni dei tuoi siti web aumenteranno. Anche i tuoi utenti avranno una buona esperienza quando utilizzano la tua applicazione.

Le visualizzazioni basate su classi consentono di risparmiare più tempo e codice rispetto alle visualizzazioni basate su funzioni, ma è possibile utilizzarne una a seconda delle preferenze e delle specifiche del progetto.