Подобрете ефективността и скалируемостта на вашето Django приложение чрез прилагане на пагинация. Ето всичко, което трябва да знаете, за да започнете.

Странирането подобрява изживяването на потребителите и производителността на приложенията при работа с големи набори от данни. Без въведена система за страниране, приложението ви ще изостава през повечето време. С Django можете да използвате вградената поддръжка за пагиниране, за да пагинирате вашето уеб приложение.

Как работи пагинацията в Django

Внедряването на пагинация в Django може да се различава в зависимост от това дали работите с изгледи, базирани на клас или на функция. Независимо от предпочитания от вас метод, основните принципи остават същите.

Django използва клас, наречен Пагинатор за прилагане на страниране. The Пагинатор клас предоставя няколко метода, които можете да използвате, за да персонализирате страницата си. При инициализиране на Пагинатор клас, той приема два задължителни параметъра; данните за пагиниране и броя елементи за показване на страница. The

instagram viewer
Пагинатор приема трети незадължителен параметър за сираци, за да посочи минималния брой елементи, които трябва да останат на последната страница. По подразбиране стойността на orphans е 0, което означава, че всички страници имат еднакъв брой елементи.

URL адресът за Django пагинирана страница е подобен на този: https://example.com/products/?page=3. The страница параметър в URL адреса казва на Django коя страница иска да види потребителят. Също така помага на Django да определи коя част от данните да покаже за тази страница.

Кодът, използван в този проект, е наличен в a GitHub хранилище и е безплатен за използване под лиценза на MIT.

Настройте своя Django проект за пагинация

Преди да правите страници в Django, трябва да имате инсталирахте Django и го настроихте на вашия компютър. След като настроите Django на вашия компютър, трябва да създадете приложение и модел за вашите данни. Ето прост модел, който можете да копирате:

от django.db импортиране модели

класПубликувай(модели. Модел):

заглавие = модели. CharField (max_length=255)
автор = модели. CharField (max_length=50)
съдържание = модели. Текстово поле(„Публикуване на съдържание“)

деф__str__(себе си):
връщане самозаглавие

Моделът по-горе е за приложение в блог. Той определя полетата за заглавие, автор и съдържание за всяка публикация в блог. Освен това има метод, който връща заглавието на публикацията за по-добро потребителско изживяване в административния панел.

Мигрирайте вашия модел, като изпълните тази команда:

python manage.py makemigrations && python manage.py мигрират

След като мигрирате вашия модел, трябва да отидете до блог>admin.py за да го регистрирате. Следният код регистрира успешно модел, наречен Публикувай.

от django.contrib импортиране администратор
от .модели импортиране Публикувай # заменете „Post“ с името на вашия модел

admin.site.register (Публикуване)

След това създайте суперпотребител и добавете публикации във вашия администраторски панел на Django. За да създадете суперпотребител, използвайте тази команда:

python manage.py createsuperuser

Горната команда ще ви преведе през процеса, илюстриран на изображението по-долу:

След като създадете суперпотребител, стартирайте вашия сървър за разработка и отидете до административния панел.

python manage.py runserver

След като вашият сървър стартира, отидете на http://127.0.0.1:8000/admin, влезте и добавете няколко публикации.

След това създайте HTML шаблон, за да визуализирате публикациите си в браузъра. Създайте своя файл в следната директория: your_app/templates/your_app_name/index.html. Ако не разбирате как да създавате шаблони, прочетете нашите уводно ръководство за MVT архитектурата на Django.

Django страниране в изглед, базиран на функции

Django ви позволява да създавате приложения или с изгледи, базирани на класове, или с изгледи, базирани на функции. За да пагинирате вашето приложение с помощта на функционален изглед. Следвай тези стъпки:

  • Отвори си views.py файл и импортирайте Пагинатор клас.
от django.core.paginator импортиране Пагинатор
  • Създайте функция за преглед, за да визуализирате публикации във вашия HTML шаблон.
от django.shortcuts импортиране изобразявам
от .модели импортиране Публикувай
от django.core.paginator импортиране Пагинатор

дефlist_view(заявка):
публикации = Post.objects.all()
връщане изобразяване (заявка, 'blog/blog_list_view.html', {"постове":постове})

  • Създайте URL модел, за да показвате вашите публикации в браузъра. Започнете, като конфигурирате URL модела в директорията на вашия проект. Отвори urls.py файл на ниво проект и добавете това към url модели:
от django.urls импортиране включват

urlpatterns = [
...,
път ('', включете ('blog.urls')),
]

В горния кодов фрагмент заменете блог с името на вашето приложение. Ако не можете да правите разлика между проект и приложение, трябва да знаете как един проект се различава от приложение в Django.

След като направите горната конфигурация, създайте a urls.py файл в директорията на вашето приложение (в този случай това е блог папка) и добавете този кодов фрагмент:

от django.urls импортиране път
от .изгледи импортиране list_view

urlpatterns = [
път ('', списък_изглед, име='списъчен изглед'),
]

Когато стартирате сървъра си и отидете до http://127.0.0.1:8000/, браузърът ще покаже публикациите ви според посочения от вас лист със стилове.

  • Променете функцията си за изглед, за да добавите логика за страниране. Ето един пример:
дефlist_view(заявка):
публикации = Post.objects.all()
paginated = Paginator (публикации, 3)
page_number = заявка. GET.get("страница") #Вземете искания номер на страница от URL адреса

страница = paginated.get_page (номер на страница)
връщане изобразяване (заявка, 'blog/blog_list_view.html', {"страница":страница})

Горният кодов фрагмент въвежда три нови променливи: пагиниран, номер на страницата, и страница. Всяка променлива прави следното:

  1. The пагиниран променлива инициализира Пагинатор клас. В този сценарий данните, които трябва да бъдат странирани, са наборът от заявки, публикации, и отнема 3 като брой елементи за показване на страница.
  2. The номер на страницата променлива получава номера на страницата от URL адреса. Например в http://127.0.0.1:8000/?page=2, номерът на страницата е 2.
  3. The страница променливата извлича конкретната страница за изобразяване от пагиниран променлива.

Досега Django трябва да е пагинирал страницата ви. Можете да навигирате до конкретни пагинирани страници, като използвате URL формата, показан на това изображение:

  • Променете своя HTML шаблон, за да показвате навигация за пагинирани страници. Използвайки наличните методи в Пагинатор class ви позволява да създадете проста навигация на вашата страница. Ето пример, който можете да добавите под първоначалния си HTML код:
 {% if page.has_previous %}
<аhref="?page={{page.previous_page_number}}"
class="btn btn-secondary mx-NN">Предишена>
{% endif %}

<аhref="?page=1"клас="btn btn-вторичен">Първоа>

{% за номер в page.paginator.page_range %}
{% if num == page.number %}
<педя>{{брой}}педя>
{% else %}
<аhref="?page={{num}}"клас="btn btn-вторичен mx-2">
{{брой}}
а>
{% endif %}
{% endfor %}

<аhref="?page={{page.paginator.num_pages}}"клас="btn btn-вторичен mx-2">
Последно
а>

{% if page.has_next %}
<аhref="?page={{page.next_page_number}}"клас="btn btn-вторичен mx-2">
Следващия
а>
{% endif %}

В горния кодов фрагмент се използват следните методи във връзка с условни изрази, за да се определи как ще изглежда навигацията за страници:

  1. has_previous: Този метод връща Вярно ако има предишна страница в пагинираните данни.
  2. предишен номер_на_страница: Този метод връща стойността на предишната страница.
  3. диапазон_страници: Този метод ви позволява да знаете колко страници имате във вашите пагинирани данни.
  4. номер: Този метод връща стойността на текущата страница.
  5. брой_страници: Този метод връща общия брой страници.
  6. има_следващ: Тази функция се връща Вярно ако има следваща страница в пагинираните данни.
  7. следващ_номер_на_страница: Този метод връща стойността на следващата страница.

Странициране на Django в базиран на клас изглед

В изглед, базиран на клас, не е нужно да импортирате и инициализирате Пагинатор клас. За да приложите пагинация в изглед, базиран на клас, трябва да посочите атрибут, наречен paginate_by. Следвайте тези стъпки, за да пагинирате приложението си с изглед, базиран на клас:

  • Напишете базиран на клас изглед и посочете paginate_by атрибут. Ето един прост пример:
от .модели импортиране Публикувай
от django.views.generic импортиране ListView

класPostListView(ListView):
модел = Пост
име_на_шаблон = 'blog/blog_list_view.html'
контекст_име_на_обект = "страница"
paginate_by = 2

Горният изглед е базирана на клас версия на базирания на функции изглед, написан по-рано. Този изглед наследява този на Django ListView клас, използван за изброяване на елементи. Той определя своята логика с атрибути като модел, име_на_шаблон, име_на_контекст_обект, и paginate_by. The paginate_by атрибут определя колко публикации да се показват на страница; в този случай 2 поста.

  • След като създадете своя изглед, променете своя urls.py файл, за да го използвате. Ето един прост пример:
от .изгледи импортиране PostListView

urlpatterns = [
път ('', PostListView.as_view(), име='списъчен изглед'),
]

  • Променете своя HTML шаблон, за да го използвате page_obj за пагинацията.
 {% if page_obj.has_previous %}
<аhref="?page={{page_obj.previous_page_number}}"
class="btn btn-secondary mx-NN">Предишена>
{% endif %}

<аhref="?page=1"клас="btn btn-вторичен">Първоа>

{% за номер в page_obj.paginator.page_range %}
{% if num == page_obj.number %}
<педяклас="текуща страница">{{брой}}педя>
{% else %}
<аhref="?page={{num}}"клас="btn btn-вторичен mx-2">
{{брой}}
а>
{% endif %}
{% endfor %}

<аhref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-secondary mx-NN">
Последно
а>

{% if page.has_next %}
<аhref="?page={{page_obj.next_page_number}}"
class="btn btn-secondary mx-NN">
Следващия
а>
{% endif %}

За разлика от HTML шаблона за изглед, базиран на функции, този шаблон използва page_obj вместо страница за представяне на обекта на страницата. Това е поведението по подразбиране за базирано на класа пагиниране в Django.

Използвайте пагинация, за да направите приложението си мащабируемо

Пагинацията намалява натоварването на вашия сървър/база данни чрез извличане и показване на по-малки подгрупи от данни наведнъж. С пагинацията производителността на вашите уебсайтове ще се увеличи. Вашите потребители също ще имат добро изживяване, когато използват вашето приложение.

Изгледи, базирани на класове, спестяват повече време и код в сравнение с изгледи, базирани на функции, но можете да използвате всеки от тях в зависимост от вашите предпочитания и спецификации на проекта.