Zvyšte efektivitu a škálovatelnost své aplikace Django implementací stránkování. Zde je vše, co potřebujete vědět, abyste mohli začít.

Stránkování zlepšuje uživatelskou zkušenost a výkon aplikací při práci s velkými datovými sadami. Bez zavedeného systému stránkování bude vaše aplikace po většinu času zaostávat. S Django můžete využít vestavěnou podporu pro stránkování pro stránkování vaší webové aplikace.

Jak funguje stránkování v Django

Implementace stránkování v Django se může lišit v závislosti na tom, zda pracujete s pohledy založenými na třídách nebo funkcích. Bez ohledu na preferovanou metodu zůstávají základní principy stejné.

Django používá třídu s názvem Paginátor implementovat stránkování. The Paginátor class poskytuje několik metod, které můžete použít k přizpůsobení stránkování. Při inicializaci Paginátor třídy, vyžaduje dva povinné parametry; data k stránkování a počet položek, které se mají zobrazit na stránce. The Paginátor přijímá třetí volitelný parametr pro sirotky, který určuje minimální počet položek, které by měly zůstat na poslední stránce. Ve výchozím nastavení je hodnota sirotků 0, což znamená, že všechny stránky mají stejný počet položek.

instagram viewer

Adresa URL stránkované stránky Django je podobná této: https://example.com/products/?page=3. The strana parametr v URL říká Django, kterou stránku chce uživatel vidět. Pomáhá také Django určit, která část dat se má pro danou stránku zobrazit.

Kód použitý v tomto projektu je k dispozici v a úložiště GitHub a můžete jej používat zdarma pod licencí MIT.

Nastavte svůj projekt Django pro stránkování

Než začnete stránkovat v Django, musíte mít nainstalovali Django a nastavili jej na vašem počítači. Po nastavení Django na vašem počítači byste měli vytvořit aplikaci a model pro vaše data. Zde je jednoduchý model, který můžete zkopírovat:

z django.db import modely

třídaPošta(modely. Modelka):

titul = modely. CharField (max_length=255)
autor = modely. CharField (max_length=50)
obsah = modely. Textové pole('Příspěvek obsahu')

def__str__(já):
vrátit se vlastní.titul

Výše uvedený model je pro blogovou aplikaci. Definuje pole názvu, autora a obsahu pro každý blogový příspěvek. Má také metodu, která vrací název příspěvku pro lepší uživatelský dojem na panelu administrátora.

Proveďte migraci modelu spuštěním tohoto příkazu:

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

Po migraci modelu byste měli přejít na blog>admin.py zaregistrovat to. Následující kód úspěšně zaregistruje model s názvem Pošta.

z django.contrib import admin
z .modely import Pošta # nahraďte 'Příspěvek' názvem svého modelu

admin.site.register (Příspěvek)

Dále vytvořte superuživatele a přidejte příspěvky do svého administrátorského panelu Django. Chcete-li vytvořit superuživatele, použijte tento příkaz:

python manage.py vytváříuperuser

Výše uvedený příkaz vás provede procesem znázorněným na obrázku níže:

Po vytvoření superuživatele spusťte svůj vývojový server a přejděte na panel správce.

runserver python manage.py

Jakmile se váš server spustí, přejděte na http://127.0.0.1:8000/admin, přihlaste se a přidejte pár příspěvků.

Dále vytvořte šablonu HTML pro vykreslení vašich příspěvků v prohlížeči. Vytvořte soubor v následujícím adresáři: your_app/templates/your_app_name/index.html. Pokud nerozumíte vytváření šablon, přečtěte si naše úvodní průvodce architekturou MVT společnosti Django.

Stránkování Django v zobrazení založeném na funkcích

Django vám umožňuje vytvářet aplikace s pohledy založenými na třídách nebo na funkcích. Stránkování aplikace pomocí zobrazení založeného na funkcích. Následuj tyto kroky:

  • Otevři tvůj views.py soubor a importujte Paginátor třída.
z django.core.paginator import Paginátor
  • Vytvořte funkci zobrazení pro vykreslení příspěvků ve vaší šabloně HTML.
z django.zkratky import poskytnout
z .modely import Pošta
z django.core.paginator import Paginátor

defzobrazení seznamu(žádost):
posts = Post.objects.all()
vrátit se vykreslit (žádost, 'blog/blog_list_view.html', {'příspěvky':příspěvky})

  • Vytvořte vzor adresy URL pro zobrazení vašich příspěvků v prohlížeči. Začněte konfigurací vzoru adresy URL v adresáři projektu. Otevři urls.py soubor na úrovni projektu a přidejte jej do vzory adres URL:
z django.urls import zahrnout

urlpatterns = [
...,
cesta('', zahrnout('blog.urls')),
]

Ve výše uvedeném úryvku kódu nahraďte blog s názvem vaší aplikace. Pokud nedokážete rozlišit mezi projektem a aplikací, měli byste to vědět jak se projekt liší od aplikace v Django.

Po provedení výše uvedené konfigurace vytvořte a urls.py soubor v adresáři vaší aplikace (v tomto případě je to blog složku) a přidejte tento fragment kódu:

z django.urls import cesta
z .zobrazení import zobrazení seznamu

urlpatterns = [
cesta('', zobrazení_seznamu, název='zobrazení seznamu'),
]

Když spustíte server a přejděte na http://127.0.0.1:8000/, prohlížeč zobrazí vaše příspěvky podle vámi zadané šablony stylů.

  • Upravte svou funkci zobrazení a přidejte logiku stránkování. Zde je příklad:
defzobrazení seznamu(žádost):
posts = Post.objects.all()
stránkováno = Paginátor (příspěvky, 3)
číslo_stránky = požadavek. GET.get('strana') #Získejte požadované číslo stránky z adresy URL

page = paginated.get_page (page_number)
vrátit se vykreslit (žádost, 'blog/blog_list_view.html', {'strana':strana})

Výše uvedený fragment kódu zavádí tři nové proměnné: stránkované, číslo stránky, a strana. Každá proměnná dělá následující:

  1. The stránkované proměnná inicializovala Paginátor třída. V tomto scénáři jsou data, která mají být stránkována, sada dotazů, příspěvky, a trvá to 3 jako počet položek k zobrazení na stránce.
  2. The číslo stránky proměnná získá číslo stránky z adresy URL. Například v http://127.0.0.1:8000/?page=2, číslo stránky je 2.
  3. The strana proměnná načte konkrétní stránku k vykreslení z stránkované variabilní.

Touto dobou už musel Django stránkovat vaši stránku. Na konkrétní stránkované stránky můžete přejít pomocí formátu adresy URL zobrazeného na tomto obrázku:

  • Upravte svou šablonu HTML tak, aby zobrazovala navigaci pro stránkované stránky. Pomocí metod dostupných v Paginátor třída umožňuje vytvořit jednoduchou navigaci na stránce. Zde je příklad, který můžete přidat pod svůj počáteční kód HTML:
 {% if page.has_previous %}
<Ahref="?page={{page.previous_page_number}}"
class="btn btn-secondary mx-NN">PředchozíA>
{% endif %}

<Ahref="?page=1"třída="btn btn-sekundární">PrvníA>

{% for num in page.paginator.page_range %}
{% if num == page.number %}
<rozpětí>{{ num }}rozpětí>
{% else %}
<Ahref="?page={{num}}"třída="btn btn-sekundární mx-2">
{{ num }}
A>
{% endif %}
{% endfor %}

<Ahref="?page={{page.paginator.num_pages}}"třída="btn btn-sekundární mx-2">
Poslední
A>

{% if page.has_next %}
<Ahref="?page={{page.next_page_number}}"třída="btn btn-sekundární mx-2">
další
A>
{% endif %}

Ve výše uvedeném úryvku kódu se ve spojení s podmíněnými příkazy používají následující metody k určení toho, jak bude navigace stránkováním vypadat:

  1. má_předchozí: Tato metoda vrací Skutečný pokud je ve stránkovaných datech předchozí stránka.
  2. předchozí_číslo_stránky: Tato metoda vrátí hodnotu předchozí stránky.
  3. stránkový rozsah: Tato metoda vám umožní zjistit, kolik stránek máte ve stránkovaných datech.
  4. číslo: Tato metoda vrací hodnotu aktuální stránky.
  5. počet_stránek: Tato metoda vrátí celkový počet stránek.
  6. má_další: Tato funkce vrací Skutečný pokud je ve stránkovaných datech další stránka.
  7. další_číslo_stránky: Tato metoda vrací hodnotu další stránky.

Stránkování Django v pohledu založeném na třídách

V zobrazení založeném na třídách nemusíte importovat a inicializovat soubor Paginátor třída. Chcete-li implementovat stránkování v pohledu založeném na třídách, měli byste zadat atribut s názvem stránkovat_by. Při stránkování aplikace pomocí zobrazení založeného na třídách postupujte takto:

  • Napište pohled založený na třídě a zadejte stránkovat_by atribut. Zde je jednoduchý příklad:
z .modely import Pošta
z django.views.generic import Zobrazení seznamu

třídaPostListView(Zobrazení seznamu):
model = Post
název_šablony = 'blog/blog_list_view.html'
kontext_název_objektu = 'strana'
paginate_by = 2

Výše uvedený pohled je třídou založenou verzí pohledu založeného na funkcích napsaného dříve. Tento pohled zdědí Django Zobrazení seznamu třídy, sloužící k výpisu položek. Definuje svou logiku pomocí atributů jako např Modelka, název_šablony, kontext_název_objektu, a stránkovat_by. The stránkovat_by atribut určuje, kolik příspěvků se zobrazí na stránce; v tomto případě 2 příspěvky.

  • Jakmile vytvoříte svůj pohled, upravte jej urls.py soubor k použití. Zde je jednoduchý příklad:
z .zobrazení import PostListView

urlpatterns = [
cesta('', PostListView.as_view(), name='zobrazení seznamu'),
]

  • Upravte šablonu HTML, kterou chcete použít page_obj pro stránkování.
 {% if page_obj.has_previous %}
<Ahref="?page={{page_obj.previous_page_number}}"
class="btn btn-secondary mx-NN">PředchozíA>
{% endif %}

<Ahref="?page=1"třída="btn btn-sekundární">PrvníA>

{% for num in page_obj.paginator.page_range %}
{% if num == page_obj.number %}
<rozpětítřída="aktuální stránka">{{ num }}rozpětí>
{% else %}
<Ahref="?page={{num}}"třída="btn btn-sekundární mx-2">
{{ num }}
A>
{% endif %}
{% endfor %}

<Ahref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-secondary mx-NN">
Poslední
A>

{% if page.has_next %}
<Ahref="?page={{page_obj.next_page_number}}"
class="btn btn-secondary mx-NN">
další
A>
{% endif %}

Na rozdíl od šablony HTML pro zobrazení založené na funkcích tato šablona používá page_obj namísto strana reprezentovat objekt stránky. Toto je výchozí chování pro stránkování založené na třídách v Django.

Použijte stránkování, aby byla vaše aplikace škálovatelná

Stránkování snižuje zatížení vašeho serveru/databáze tím, že načítá a zobrazuje menší podmnožiny dat najednou. S stránkováním se zvýší výkon vašich webových stránek. Vaši uživatelé budou mít také dobrou zkušenost s používáním vaší aplikace.

Pohledy založené na třídách šetří více času a kódu ve srovnání s pohledy založenými na funkcích, ale můžete použít kterýkoli z nich v závislosti na vašich preferencích a specifikacích projektu.