Izboljšajte učinkovitost in razširljivost vaše aplikacije Django z implementacijo paginacije. Tukaj je vse, kar morate vedeti, da začnete.
Paginacija izboljša uporabniško izkušnjo in delovanje aplikacij pri delu z velikimi nabori podatkov. Brez vzpostavljenega sistema paginacije bo vaša aplikacija večino časa zaostajala. Z Django lahko izkoristite vgrajeno podporo za ostranjevanje za ostranjevanje vaše spletne aplikacije.
Kako deluje paginacija v Djangu
Implementacija označevanja strani v Djangu se lahko razlikuje glede na to, ali delate s pogledi, ki temeljijo na razredih ali funkcijah. Ne glede na vašo prednostno metodo, osnovna načela ostajajo enaka.
Django uporablja razred, imenovan Paginator za izvajanje paginacije. The Paginator ponuja več metod, ki jih lahko uporabite za prilagajanje označevanja strani. Pri inicializaciji Paginator razreda, zahteva dva obvezna parametra; podatke za paginacijo in število elementov za prikaz na stran. The Paginator sprejme tretji izbirni parameter za sirote, da določi najmanjše število elementov, ki naj ostanejo na zadnji strani. Privzeto je vrednost sirot 0, kar pomeni, da imajo vse strani enako število elementov.
URL za Django paginirano stran je podoben temu: https://example.com/products/?page=3. The strani parameter v URL-ju pove Djangu, katero stran želi uporabnik videti. Prav tako pomaga Djangu določiti, kateri del podatkov naj prikaže za to stran.
Koda, uporabljena v tem projektu, je na voljo v a Repozitorij GitHub in je brezplačen za uporabo pod licenco MIT.
Nastavite svoj projekt Django za označevanje strani
Preden paginirate v Djangu, morate imeti namestite Django in ga nastavite na vašem računalniku. Ko nastavite Django v računalniku, morate ustvariti aplikacijo in model za svoje podatke. Tukaj je preprost model, ki ga lahko kopirate:
od django.db uvoz modeli
razredObjavi(modeli. model):
naslov = modeli. CharField (max_length=255)
avtor = modeli. CharField (max_length=50)
vsebina = modeli. TextField('Objavi vsebino')
def__str__(sebe):
vrnitev samonaslov
Zgornji model je za aplikacijo za blog. Določa polja naslova, avtorja in vsebine za vsako objavo v spletnem dnevniku. Ima tudi metodo, ki vrne naslov objave za boljšo uporabniško izkušnjo v skrbniški plošči.
Preselite svoj model tako, da zaženete ta ukaz:
python manage.py makemigrations && python manage.py migrate
Po selitvi modela se pomaknite do blog>admin.py da ga registrirate. Naslednja koda uspešno registrira imenovani model Objavi.
od django.contrib uvoz admin
od .modeli uvoz Objavi # zamenjajte 'Post' z imenom vašega modela
admin.site.register (objava)
Nato ustvarite superuporabnika in dodajte objave v skrbniško ploščo Django. Če želite ustvariti superuporabnika, uporabite ta ukaz:
python manage.py createsuperuser
Zgornji ukaz vas bo popeljal skozi postopek, prikazan na spodnji sliki:
Ko ustvarite superuporabnika, zaženite razvojni strežnik in se pomaknite do skrbniške plošče.
python manage.py runserver
Ko se vaš strežnik zažene, pojdite na http://127.0.0.1:8000/admin, se prijavite in dodajte nekaj objav.
Nato ustvarite predlogo HTML za prikaz vaših objav v brskalniku. Ustvarite svojo datoteko v naslednjem imeniku: vaša_aplikacija/predloge/ime_vaše_aplikacije/index.html. Če ne razumete, kako ustvariti predloge, preberite naše uvodni vodnik v Djangovo arhitekturo MVT.
Paginacija Django v pogledu na podlagi funkcij
Django vam omogoča izdelavo aplikacij bodisi s pogledi, ki temeljijo na razredu, bodisi s pogledi, ki temeljijo na funkcijah. Za paginacijo vaše aplikacije s pogledom, ki temelji na funkcijah. Sledite tem korakom:
- Odpri svojo views.py datoteko in uvozite Paginator razred.
od django.core.paginator uvoz Paginator
- Ustvarite funkcijo pogleda za upodabljanje objav v svoji predlogi HTML.
od django.shortcuts uvoz upodabljati
od .modeli uvoz Objavi
od django.core.paginator uvoz Paginator
defpogled seznama(prošnja):
objave = Post.objects.all()
vrnitev render (zahteva, 'blog/blog_list_view.html', {'objave':objave})
- Ustvarite vzorec URL-ja za prikaz svojih objav v brskalniku. Začnite tako, da konfigurirate vzorec URL v imeniku vašega projekta. Odprite urls.py datoteko na ravni projekta in to dodajte v vzorci url:
od django.urls uvoz vključujejo
urlvzorci = [
...,
pot('', vključi('blog.urls')),
]
V zgornjem delčku kode zamenjajte blog z imenom vaše aplikacije. Če ne morete razlikovati med projektom in aplikacijo, morate vedeti kako se projekt razlikuje od aplikacije v Djangu.
Po izvedbi zgornje konfiguracije ustvarite a urls.py datoteko v imeniku vaše aplikacije (v tem primeru je to datoteka blog mapo) in dodajte ta delček kode:
od django.urls uvoz pot
od .pogledi uvoz pogled seznama
urlvzorci = [
pot('', seznam_pogled, ime='pogled seznama'),
]
Ko zaženete strežnik in se pomaknete na http://127.0.0.1:8000/, bo brskalnik prikazal vaše objave v skladu z izbranim slogovnim listom.
- Spremenite svojo funkcijo pogleda, da dodate logiko označevanja strani. Tukaj je primer:
defpogled seznama(prošnja):
objave = Post.objects.all()
paginated = Paginator (objave, 3)
page_number = zahteva. GET.get('stran') #Pridobite zahtevano številko strani iz URL-ja
stran = paginated.get_page (številka_strani)
vrnitev render (zahteva, 'blog/blog_list_view.html', {'stran':stran})
Zgornji delček kode uvaja tri nove spremenljivke: paginirano, stran_številka, in strani. Vsaka spremenljivka naredi naslednje:
- The paginirano spremenljivka je inicializirala Paginator razred. V tem scenariju so podatki, ki jih je treba paginirati, niz poizvedb, objave, in traja 3 kot število elementov za prikaz na stran.
- The stran_številka spremenljivka pridobi številko strani iz URL-ja. Na primer, v http://127.0.0.1:8000/?page=2, številka strani je 2.
- The strani spremenljivka pridobi določeno stran za upodobitev iz paginirano spremenljivka.
Do zdaj je Django že zagotovo paginiral vašo stran. Do določenih paginiranih strani se lahko pomaknete z uporabo oblike URL-ja, prikazane na tej sliki:
- Spremenite svojo predlogo HTML za prikaz navigacije za ostranjene strani. Z uporabo metod, ki so na voljo v Paginator razred vam omogoča ustvarjanje preproste navigacije na vaši strani. Tu je primer, ki ga lahko dodate pod prvotno kodo HTML:
{% if page.has_previous %}
<ahref="?page={{page.previous_page_number}}"
class="btn btn-secondary mx-NN">Prejšnjia>
{% endif %}<ahref="?page=1"razred="btn btn-sekundarni">najpreja>
{% za število v page.paginator.page_range %}
{% if num == page.number %}
<razpon>{{ št }}razpon>
{% else %}
<ahref="?page={{num}}"razred="btn btn-sekundarni mx-2">
{{ št }}
a>
{% endif %}
{% endfor %}<ahref="?page={{page.paginator.num_pages}}"razred="btn btn-sekundarni mx-2">
Zadnji
a>
{% if page.has_next %}
<ahref="?page={{page.next_page_number}}"razred="btn btn-sekundarni mx-2">
Naslednji
a>
{% endif %}
V zgornjem delčku kode so naslednje metode uporabljene v povezavi s pogojnimi stavki za določitev, kako bo izgledala navigacija po straneh:
- has_previous: Ta metoda vrne Prav če obstaja prejšnja stran v paginiranih podatkih.
- prejšnja_številka_strani: Ta metoda vrne vrednost prejšnje strani.
- obseg_strani: Ta metoda vam pove, koliko strani imate v svojih paginiranih podatkih.
- število: Ta metoda vrne vrednost trenutne strani.
- num_pages: Ta metoda vrne skupno število strani.
- has_next: Ta funkcija se vrne Prav če obstaja naslednja stran v paginiranih podatkih.
- naslednja_številka_strani: Ta metoda vrne vrednost naslednje strani.
Paginacija Django v pogledu na podlagi razreda
V pogledu, ki temelji na razredu, vam ni treba uvoziti in inicializirati Paginator razred. Če želite implementirati ostranjevanje v pogledu, ki temelji na razredu, morate podati atribut, imenovan paginate_by. Sledite tem korakom, da svojo aplikacijo paginirate s pogledom, ki temelji na razredu:
- Napišite pogled, ki temelji na razredu, in določite paginate_by atribut. Tukaj je preprost primer:
od .modeli uvoz Objavi
od django.views.generic uvoz Pogled seznama
razredPostListView(Pogled seznama):
model = Post
ime_predloge = 'blog/blog_list_view.html'
ime_objekta_konteksta = 'stran'
paginate_by = 2
Zgornji pogled je različica, ki temelji na razredu, prej napisanega pogleda, ki temelji na funkcijah. Ta pogled podeduje Djangov Pogled seznama razred, ki se uporablja za seznam predmetov. Svojo logiko definira z atributi, kot je npr model, ime_predloge, ime_kontekstnega_objekta, in paginate_by. The paginate_by atribut določa, koliko objav je prikazanih na stran; v tem primeru 2 objavi.
- Ko ustvarite svoj pogled, ga spremenite urls.py datoteko, da jo uporabite. Tukaj je preprost primer:
od .pogledi uvoz PostListView
urlvzorci = [
pot('', PostListView.as_view(), name='pogled seznama'),
]
- Spremenite svojo predlogo HTML za uporabo page_obj za paginacijo.
{% if page_obj.has_previous %}
<ahref="?page={{page_obj.previous_page_number}}"
class="btn btn-secondary mx-NN">Prejšnjia>
{% endif %}<ahref="?page=1"razred="btn btn-sekundarni">najpreja>
{% za število v page_obj.paginator.page_range %}
{% if num == page_obj.number %}
<razponrazred="trenutna stran">{{ št }}razpon>
{% else %}
<ahref="?page={{num}}"razred="btn btn-sekundarni mx-2">
{{ št }}
a>
{% endif %}
{% endfor %}<ahref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-secondary mx-NN">
Zadnji
a>
{% if page.has_next %}
<ahref="?page={{page_obj.next_page_number}}"
class="btn btn-secondary mx-NN">
Naslednji
a>
{% endif %}
Za razliko od predloge HTML za pogled, ki temelji na funkcijah, ta predloga uporablja page_obj namesto strani za predstavitev predmeta strani. To je privzeto vedenje za ostranjevanje na podlagi razreda v Djangu.
Uporabite paginacijo, da bo vaša aplikacija prilagodljiva
Paginacija zmanjša obremenitev vašega strežnika/baze podatkov s pridobivanjem in prikazom manjših podnaborov podatkov hkrati. S paginacijo se bo učinkovitost vaših spletnih strani povečala. Tudi vaši uporabniki bodo imeli dobro izkušnjo z uporabo vaše aplikacije.
Pogledi, ki temeljijo na razredih, prihranijo več časa in kode v primerjavi s pogledi, ki temeljijo na funkcijah, vendar lahko uporabite enega od njih, odvisno od vaših želja in specifikacij projekta.