Poboljšajte učinkovitost i skalabilnost svoje Django aplikacije implementacijom paginacije. Ovdje je sve što trebate znati da biste započeli.
Paginacija poboljšava korisničko iskustvo i izvedbu aplikacije kada se radi s velikim skupovima podataka. Bez uspostavljenog sustava paginacije, vaša aplikacija će većinu vremena zaostajati. Uz Django, možete iskoristiti ugrađenu podršku za paginaciju za paginaciju svoje web aplikacije.
Kako paginacija radi u Djangu
Implementacija paginacije u Djangu može se razlikovati ovisno o tome radite li s prikazima koji se temelje na klasi ili funkciji. Bez obzira na metodu koju preferirate, temeljna načela ostaju ista.
Django koristi klasu tzv Paginator implementirati paginaciju. The Paginator klasa nudi nekoliko metoda koje možete koristiti za prilagodbu paginacije. Prilikom inicijalizacije Paginator klasa, uzima dva obvezna parametra; podatke za paginaciju i broj stavki za prikaz po stranici. The Paginator uzima treći izborni parametar za siročad kako bi odredio minimalni broj stavki koje bi trebale ostati na posljednjoj stranici. Prema zadanim postavkama, vrijednost siročadi je 0 što znači da sve stranice imaju isti broj stavki.
URL Django paginirane stranice je sličan ovome: https://example.com/products/?page=3. The stranica parametar u URL-u govori Djangu koju stranicu korisnik želi vidjeti. Također pomaže Djangu odrediti koji dio podataka prikazati za tu stranicu.
Kod korišten u ovom projektu dostupan je u a GitHub spremište i besplatan je za korištenje pod MIT licencom.
Postavite svoj Django projekt za paginaciju
Prije nego što paginirate u Djangu, morate imati instalirali Django i postavili ga na svom računalu. Nakon što postavite Django na svoje računalo, trebali biste izraditi aplikaciju i model za svoje podatke. Evo jednostavnog modela koji možete kopirati:
iz django.db uvoz modeli
razredaPost(modeli. Model):
naslov = modeli. CharField (max_length=255)
autor = modeli. CharField (max_length=50)
sadržaj = modeli. Polje za tekst('Objavi sadržaj')
def__str__(sebe):
povratak sam.naslov
Gornji model je za blog aplikaciju. Definira polja naslova, autora i sadržaja za svaki post na blogu. Također ima metodu koja vraća naslov objave za bolje korisničko iskustvo u administratorskoj ploči.
Migrirajte svoj model pokretanjem ove naredbe:
python manage.py makemigrations && python manage.py migrirati
Nakon migracije vašeg modela, trebali biste otići na blog>admin.py da ga registrirate. Sljedeći kod uspješno registrira model tzv Post.
iz django.doprinos uvoz admin
iz .modeli uvoz Post # zamijenite 'Post' nazivom vašeg modela
admin.site.register (Post)
Zatim stvorite superkorisnika i dodajte postove u svoj Django admin panel. Za stvaranje superkorisnika koristite ovu naredbu:
python management.py createsuperuser
Gornja naredba provest će vas kroz proces prikazan na slici ispod:
Nakon kreiranja superkorisnika, pokrenite svoj razvojni poslužitelj i idite na administrativnu ploču.
python manage.py runserver
Nakon što se vaš poslužitelj pokrene, idite na http://127.0.0.1:8000/admin, prijavite se i dodajte nekoliko postova.
Zatim izradite HTML predložak za prikaz vaših postova u pregledniku. Izradite svoju datoteku u sljedećem direktoriju: vaša_aplikacija/predlošci/naziv_vaše_aplikacije/index.html. Ako ne razumijete kako izraditi predloške, pročitajte naše uvodni vodič u Djangovu MVT arhitekturu.
Django paginacija u prikazu temeljenom na funkcijama
Django vam omogućuje izradu aplikacija s pogledima temeljenim na klasi ili s prikazima koji se temelje na funkcijama. Za paginaciju vaše aplikacije korištenjem prikaza temeljenog na funkciji. Prati ove korake:
- Otvori svoju pogledi.py datoteku i uvoz Paginator razreda.
iz django.core.paginator uvoz Paginator
- Stvorite funkciju prikaza za prikaz objava u vašem HTML predlošku.
iz django.prečaci uvoz prikazati
iz .modeli uvoz Post
iz django.core.paginator uvoz Paginator
defprikaz_liste(zahtjev):
postovi = Post.objects.all()
povratak prikazati (zahtjev, 'blog/blog_list_view.html', {'postovi':postovi})
- Napravite obrazac URL-a za prikaz svojih postova u pregledniku. Započnite konfiguriranjem uzorka URL-a u direktoriju vašeg projekta. Otvori urls.py datoteku na razini projekta i dodajte ovo u url uzorci:
iz django.urls uvoz uključiti
url uzorci = [
...,
staza('', uključi('blog.urls')),
]
U gornjem isječku koda zamijenite blog s nazivom vaše aplikacije. Ako ne možete razlikovati projekt od aplikacije, trebali biste to znati kako se projekt razlikuje od aplikacije u Djangu.
Nakon što izvršite gornju konfiguraciju, kreirajte a urls.py datoteku u direktoriju vaše aplikacije (u ovom slučaju to je blog folder) i dodajte ovaj isječak koda:
iz django.urls uvoz staza
iz .pogleda uvoz prikaz_liste
url uzorci = [
staza('', prikaz_liste, ime='prikaz popisa'),
]
Kada pokrenete svoj poslužitelj i prijeđete na http://127.0.0.1:8000/, preglednik će prikazati vaše postove prema vašem navedenom listu stilova.
- Izmijenite svoju funkciju prikaza kako biste dodali logiku označavanja stranica. Evo primjera:
defprikaz_liste(zahtjev):
postovi = Post.objects.all()
paginirano = Paginator (postovi, 3)
broj_stranice = zahtjev. GET.get('stranica') #Dohvatite traženi broj stranice s URL-a
stranica = paginated.get_page (broj_stranice)
povratak prikazati (zahtjev, 'blog/blog_list_view.html', {'stranica':stranica})
Gornji isječak koda uvodi tri nove varijable: paginirano, broj stranice, i stranica. Svaka varijabla čini sljedeće:
- The paginirano varijabla je inicijalizirala Paginator razreda. U ovom scenariju, podaci koji se paginiraju su skup upita, postovi, i potrebno je 3 kao broj stavki za prikaz po stranici.
- The broj stranice varijabla dobiva broj stranice iz URL-a. Na primjer, u http://127.0.0.1:8000/?page=2, broj stranice je 2.
- The stranica varijabla dohvaća određenu stranicu za prikaz iz paginirano varijabla.
Do sada je Django sigurno paginirao vašu stranicu. Možete se kretati do određenih paginiranih stranica koristeći URL format prikazan na ovoj slici:
- Izmijenite svoj HTML predložak za prikaz navigacije za paginirane stranice. Koristeći metode dostupne u Paginator klasa vam omogućuje stvaranje jednostavne navigacije na vašoj stranici. Evo primjera koji možete dodati ispod svog početnog HTML koda:
{% if page.has_previous %}
<ahref="?page={{page.previous_page_number}}"
class="btn btn-secondary mx-NN">Prethodnoa>
{% završi ako %}<ahref="?page=1"razreda="btn btn-sekundarni">Prvia>
{% za broj u page.paginator.page_range %}
{% if num == page.number %}
<raspon>{{ num }}raspon>
{% else %}
<ahref="?stranica={{num}}"razreda="btn btn-sekundarni mx-2">
{{ num }}
a>
{% završi ako %}
{% endfor %}<ahref="?page={{page.paginator.num_pages}}"razreda="btn btn-sekundarni mx-2">
Posljednji
a>
{% if page.has_next %}
<ahref="?page={{page.next_page_number}}"razreda="btn btn-sekundarni mx-2">
Sljedeći
a>
{% završi ako %}
U gornjem isječku koda, sljedeće se metode koriste zajedno s uvjetnim izjavama kako bi se odredilo kako će izgledati navigacija po stranicama:
- ima_prethodni: Ova metoda vraća Pravi ako postoji prethodna stranica u paginiranim podacima.
- prethodni_broj_stranice: Ova metoda vraća vrijednost prethodne stranice.
- raspon_stranica: Ova metoda vam omogućuje da znate koliko stranica imate u svojim paginiranim podacima.
- broj: Ova metoda vraća vrijednost trenutne stranice.
- broj_stranica: Ova metoda vraća ukupan broj stranica.
- ima_sljedeći: Ova funkcija se vraća Pravi ako postoji sljedeća stranica u paginiranim podacima.
- sljedeći_broj_stranice: Ova metoda vraća vrijednost sljedeće stranice.
Django paginacija u prikazu temeljenom na klasi
U prikazu koji se temelji na klasi, ne morate uvoziti i inicijalizirati Paginator razreda. Za implementaciju paginacije u prikazu temeljenom na klasi, trebali biste navesti atribut tzv paginiraj_po. Slijedite ove korake da paginirate svoju aplikaciju s prikazom koji se temelji na klasi:
- Napišite pogled temeljen na klasi i navedite paginiraj_po atribut. Evo jednostavnog primjera:
iz .modeli uvoz Post
iz django.views.generic uvoz ListView
razredaPostListView(ListView):
model = Post
naziv_predloška = 'blog/blog_list_view.html'
ime_objekta_konteksta = 'stranica'
paginiraj po = 2
Gornji pogled je verzija koja se temelji na klasi ranije napisanog pogleda koji se temelji na funkciji. Ovaj pogled nasljeđuje Djangov ListView klasa, koja se koristi za popis stavki. Svoju logiku definira atributima kao što su model, naziv_predloška, ime_objekta_konteksta, i paginiraj_po. The paginiraj_po atribut određuje koliko postova prikazati po stranici; u ovom slučaju, 2 posta.
- Nakon što stvorite svoj prikaz, izmijenite svoj urls.py datoteku da biste je koristili. Evo jednostavnog primjera:
iz .pogleda uvoz PostListView
url uzorci = [
staza('', PostListView.as_view(), name='prikaz popisa'),
]
- Izmijenite svoj HTML predložak za korištenje stranica_obj za paginaciju.
{% if page_obj.has_previous %}
<ahref="?page={{page_obj.previous_page_number}}"
class="btn btn-secondary mx-NN">Prethodnoa>
{% završi ako %}<ahref="?page=1"razreda="btn btn-sekundarni">Prvia>
{% za broj u page_obj.paginator.page_range %}
{% if num == page_obj.number %}
<rasponrazreda="Trenutna stranica">{{ num }}raspon>
{% else %}
<ahref="?stranica={{num}}"razreda="btn btn-sekundarni mx-2">
{{ num }}
a>
{% završi ako %}
{% endfor %}<ahref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-secondary mx-NN">
Posljednji
a>
{% if page.has_next %}
<ahref="?page={{page_obj.next_page_number}}"
class="btn btn-secondary mx-NN">
Sljedeći
a>
{% završi ako %}
Za razliku od HTML predloška za prikaz temeljen na funkcijama, ovaj predložak koristi stranica_obj umjesto stranica za predstavljanje objekta stranice. Ovo je zadano ponašanje za paginaciju temeljenu na klasi u Djangu.
Upotrijebite numeriranje stranica kako biste svoju aplikaciju učinili skalabilnom
Paginacija smanjuje opterećenje vašeg poslužitelja/baze podataka dohvaćanjem i prikazom manjih podskupova podataka u isto vrijeme. Uz paginaciju, izvedba vaših web stranica će se povećati. Vaši će korisnici također imati dobro iskustvo pri korištenju vaše aplikacije.
Pogledi koji se temelje na klasi štede više vremena i koda u usporedbi s prikazima koji se temelje na funkcijama, ali možete koristiti bilo koji od njih ovisno o vašim željama i specifikacijama projekta.