Zwiększ wydajność i skalowalność swojej aplikacji Django, wdrażając paginację. Oto wszystko, co musisz wiedzieć, aby zacząć.

Podział na strony poprawia wrażenia użytkownika i wydajność aplikacji w przypadku dużych zestawów danych. Bez systemu stronicowania aplikacja będzie przez większość czasu działać z opóźnieniem. Dzięki Django możesz wykorzystać wbudowaną obsługę stronicowania do stronicowania swojej aplikacji internetowej.

Jak działa paginacja w Django

Implementacja paginacji w Django może się różnić w zależności od tego, czy pracujesz z widokami opartymi na klasach, czy na funkcjach. Niezależnie od preferowanej metody, podstawowe zasady pozostają takie same.

Django używa klasy o nazwie Paginator wdrożyć paginację. The Paginator class udostępnia kilka metod, których można użyć do dostosowania podziału na strony. Podczas inicjalizacji Paginator class, przyjmuje dwa obowiązkowe parametry; dane do podziału na strony oraz liczbę elementów do wyświetlenia na stronie. The Paginator przyjmuje trzeci opcjonalny parametr dla sierot, aby określić minimalną liczbę elementów, które powinny pozostać na ostatniej stronie. Domyślnie wartość sierot wynosi 0, co oznacza, że ​​wszystkie strony mają taką samą liczbę elementów.

instagram viewer

Adres URL strony z paginacją Django jest podobny do tego: https://example.com/products/?page=3. The strona parametr w adresie URL mówi Django, którą stronę użytkownik chce zobaczyć. Pomaga również Django określić, która część danych ma być wyświetlana na tej stronie.

Kod użyty w tym projekcie jest dostępny w formacie Repozytorium GitHub i jest darmowy do użytku na licencji MIT.

Skonfiguruj swój projekt Django do paginacji

Zanim zaczniesz paginować w Django, musisz to mieć zainstalowałeś Django i skonfigurowałeś go na swoim komputerze. Po skonfigurowaniu Django na swoim komputerze powinieneś stworzyć aplikację i model dla swoich danych. Oto prosty model, który możesz skopiować:

z django.db import modele

klasaPost(modele. Model):

tytuł = modele. CharField (max_length=255)
autor = modele. CharField (max_length=50)
zawartość = modele. Pole tekstowe('Treść postu')

pok__str__(samego siebie):
powrót tytuł własny

Powyższy model dotyczy aplikacji blogowej. Definiuje pola tytułu, autora i treści dla każdego posta na blogu. Posiada również metodę, która zwraca tytuł postu dla lepszego doświadczenia użytkownika w panelu administracyjnym.

Przeprowadź migrację swojego modelu, uruchamiając to polecenie:

python manage.py makemigrations && python manage.py migracja

Po migracji modelu należy przejść do blog>admin.py aby go zarejestrować. Poniższy kod pomyślnie rejestruje model o nazwie Post.

z django.contrib import Admin
z .modele import Post # zastąp „Post” nazwą swojego modelu

admin.site.register (Opublikuj)

Następnie utwórz superużytkownika i dodaj posty w swoim panelu administracyjnym Django. Aby utworzyć superużytkownika, użyj tego polecenia:

python manage.py tworzy superużytkownika

Powyższe polecenie przeprowadzi Cię przez proces przedstawiony na poniższym obrazku:

Po utworzeniu superużytkownika uruchom serwer deweloperski i przejdź do panelu administracyjnego.

python Manage.py serwer uruchomieniowy

Po uruchomieniu serwera przejdź do http://127.0.0.1:8000/admin, zaloguj się i dodaj kilka postów.

Następnie utwórz szablon HTML do renderowania postów w przeglądarce. Utwórz plik w następującym katalogu: twoja_aplikacja/szablony/nazwa_twojej_aplikacji/index.html. Jeśli nie rozumiesz, jak tworzyć szablony, przeczytaj nasz przewodnik wprowadzający do architektury MVT Django.

Paginacja Django w widoku opartym na funkcjach

Django pozwala budować aplikacje z widokami opartymi na klasach lub widokach opartych na funkcjach. Aby podzielić aplikację na strony przy użyciu widoku opartego na funkcjach. Wykonaj następujące kroki:

  • Otwórz swoje wyświetlenia.py zarchiwizuj i zaimportuj plik Paginator klasa.
z django.core.paginator import Paginator
  • Utwórz funkcję widoku, aby wyświetlać posty w szablonie HTML.
z django.skróty import renderowanie
z .modele import Post
z django.core.paginator import Paginator

pokwidok_listy(wniosek):
posty = Post.objects.all()
powrót renderować (prośba, „blog/blog_list_view.html”, {„posty”:posty})

  • Utwórz wzorzec adresu URL, aby wyświetlać swoje posty w przeglądarce. Zacznij od skonfigurowania wzorca adresu URL w katalogu projektu. Otworzyć urls.py plik na poziomie projektu i dodaj go do pliku wzorce adresów URL:
z django.adresy URL import włączać

wzorce adresów URL = [
...,
ścieżka('', włączać(„blog.adresy URL”)),
]

W powyższym fragmencie kodu zastąp blog z nazwą Twojej aplikacji. Jeśli nie potrafisz odróżnić projektu od aplikacji, powinieneś o tym wiedzieć czym różni się projekt od aplikacji w Django.

Po wykonaniu powyższej konfiguracji utwórz plik urls.py plik w katalogu aplikacji (w tym przypadku jest to plik blog folder) i dodaj ten fragment kodu:

z django.adresy URL import ścieżka
z .wyświetlenia import widok_listy

wzorce adresów URL = [
ścieżka('', widok_listy, nazwa=„widok listy”),
]

Po uruchomieniu serwera i przejściu do http://127.0.0.1:8000/, przeglądarka wyświetli Twoje posty zgodnie z określonym arkuszem stylów.

  • Zmodyfikuj funkcję widoku, aby dodać logikę stronicowania. Oto przykład:
pokwidok_listy(wniosek):
posty = Post.objects.all()
paginated = Paginator (posty, 3)
numer_strony = żądanie. POBIERZ.pobierz('strona') #Pobierz żądany numer strony z adresu URL

strona = paginowana.get_page (numer_strony)
powrót renderować (prośba, „blog/blog_list_view.html”, {'strona':strona})

Powyższy fragment kodu wprowadza trzy nowe zmienne: paginowane, numer strony, I strona. Każda zmienna wykonuje następujące czynności:

  1. The paginowane zmienna zainicjowała Paginator klasa. W tym scenariuszu dane do podziału na strony to zestaw zapytań, posty, i to trwa 3 jako liczbę elementów do wyświetlenia na stronie.
  2. The numer strony zmienna pobiera numer strony z adresu URL. Na przykład w http://127.0.0.1:8000/?page=2, numer strony to 2.
  3. The strona zmienna pobiera określoną stronę do renderowania z pliku paginowane zmienny.

Do tej pory Django musiało podzielić twoją stronę na strony. Możesz przejść do określonych stron podzielonych na strony, używając formatu adresu URL pokazanego na tym obrazku:

  • Zmodyfikuj swój szablon HTML, aby wyświetlić nawigację dla stron podzielonych na strony. Korzystając z metod dostępnych w Paginator class umożliwia stworzenie prostej nawigacji na stronie. Oto przykład, który możesz dodać poniżej początkowego kodu HTML:
 {% jeśli page.has_previous %}
<Ahref="?page={{page.previous_page_number}}"
class="btn btn-secondary mx-NN">PoprzedniA>
{% końcówka %}

<Ahref="?strona=1"klasa="btn btn-drugorzędny">PierwszyA>

{% dla liczby w page.paginator.page_range %}
{% if num == numer.strony %}
<Zakres>{{ liczba }}Zakres>
{% w przeciwnym razie %}
<Ahref="?page={{num}}"klasa="btn btn-podrzędny mx-2">
{{ liczba }}
A>
{% końcówka %}
{% koniec dla %}

<Ahref="?page={{page.paginator.num_pages}}"klasa="btn btn-podrzędny mx-2">
Ostatni
A>

{% jeśli page.has_next %}
<Ahref="?page={{page.next_page_number}}"klasa="btn btn-podrzędny mx-2">
Następny
A>
{% końcówka %}

W powyższym fragmencie kodu zastosowano następujące metody w połączeniu z instrukcjami warunkowymi, aby określić, jak będzie wyglądać nawigacja stronicowania:

  1. ma_poprzedni: Ta metoda zwraca PRAWDA jeśli w danych podzielonych na strony znajduje się poprzednia strona.
  2. poprzedni_numer_strony: Ta metoda zwraca wartość z poprzedniej strony.
  3. zakres stron: ta metoda pozwala dowiedzieć się, ile stron masz w danych podzielonych na strony.
  4. numer: Ta metoda zwraca wartość bieżącej strony.
  5. liczba_stron: Ta metoda zwraca całkowitą liczbę stron.
  6. ma_następny: Ta funkcja powraca PRAWDA jeśli w danych podzielonych na strony znajduje się następna strona.
  7. numer_następnej_strony: Ta metoda zwraca wartość następnej strony.

Paginacja Django w widoku opartym na klasach

W widoku opartym na klasach nie trzeba importować i inicjować pliku Paginator klasa. Aby zaimplementować podział na strony w widoku opartym na klasach, należy określić atrybut o nazwie paginacja_przez. Wykonaj następujące kroki, aby podzielić aplikację na strony z widokiem opartym na klasach:

  • Napisz widok oparty na klasach i określ paginacja_przez atrybut. Oto prosty przykład:
z .modele import Post
z django.views.generic import Widok listy

klasaWidok listy postów(Widok listy):
modelka = poczta
nazwa_szablonu = „blog/blog_list_view.html”
nazwa_obiektu_kontekstu = 'strona'
paginacja_by = 2

Powyższy widok jest opartą na klasach wersją napisanego wcześniej widoku opartego na funkcjach. Ten widok dziedziczy Django Widok listy klasa, używana do wystawiania przedmiotów. Definiuje swoją logikę za pomocą atrybutów, takich jak Model, nazwa_szablonu, nazwa_obiektu_kontekstu, I paginacja_przez. The paginacja_przez atrybut określa, ile postów ma być wyświetlanych na stronie; w tym przypadku 2 posty.

  • Po utworzeniu widoku zmodyfikuj swój urls.py plik, aby go użyć. Oto prosty przykład:
z .wyświetlenia import Widok listy postów

wzorce adresów URL = [
ścieżka('', PostListView.as_view(), nazwa=„widok listy”),
]

  • Zmodyfikuj szablon HTML, którego chcesz użyć obiekt_strony za paginację.
 {% jeśli page_obj.has_previous %}
<Ahref="?page={{page_obj.previous_page_number}}"
class="btn btn-secondary mx-NN">PoprzedniA>
{% końcówka %}

<Ahref="?strona=1"klasa="btn btn-drugorzędny">PierwszyA>

{% dla liczby w page_obj.paginator.page_range %}
{% if num == page_obj.number %}
<Zakresklasa="bieżąca strona">{{ liczba }}Zakres>
{% w przeciwnym razie %}
<Ahref="?page={{num}}"klasa="btn btn-podrzędny mx-2">
{{ liczba }}
A>
{% końcówka %}
{% koniec dla %}

<Ahref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-podrzędny mx-NN">
Ostatni
A>

{% jeśli page.has_next %}
<Ahref="?page={{page_obj.next_page_number}}"
class="btn btn-podrzędny mx-NN">
Następny
A>
{% końcówka %}

W przeciwieństwie do szablonu HTML dla widoku opartego na funkcjach, ten szablon używa obiekt_strony zamiast strona do reprezentowania obiektu strony. Jest to domyślne zachowanie dla stronicowania opartego na klasach w Django.

Użyj paginacji, aby Twoja aplikacja była skalowalna

Paginacja zmniejsza obciążenie serwera/bazy danych poprzez pobieranie i wyświetlanie mniejszych podzbiorów danych jednocześnie. Dzięki paginacji wydajność Twoich stron internetowych wzrośnie. Twoi użytkownicy również będą mieli dobre doświadczenia podczas korzystania z Twojej aplikacji.

Widoki oparte na klasach oszczędzają więcej czasu i kodu w porównaniu z widokami opartymi na funkcjach, ale można użyć dowolnego z nich w zależności od preferencji i specyfikacji projektu.