Django - Tutorial 007. Adding Pagination based on django-bootstrap3

Pagination, django-bootstrap3, Python

The number of articles on the new site began to approach the 10 pieces, so urgently add Pagination, to be able to flip through the pages on the site. But as already used django-bootstrap3 module, and Pagination will be used in this module. Why do the extra work, when it is all done? Is not it.

To add Pagination is necessary:

  1. Use Paginator class from django.core.pagination;
  2. Add to bootstrap_pagination main page template-bound;
  3. Add the checking current page number;
  4. And ... do not add anything new to the url templates.

Adding Paginator into view

Paginator - a class that contains the current page, which is loaded when calling page(), which will be transferred to the page number as an argument. In our case, we will try to pick up the number of the page, if it exists, or if the page is displayed out of the number of pages that display the latest. If the number was not transferred, it will refund the first page.

from django.shortcuts import render_to_response
from django.views import View
from django.core.paginator import Paginator

from knowledge.models import *

# Presentation based on View class
class EIndexView(View):

    def get(self, request):
        context = {}
        # Taking all of the published article, sorted by date of publication
        all_articles = Article.objects.filter(article_status=True).order_by('-article_date')
        # Create Pagination, in which we send article and show,
        # that there will be 10 pieces on one page
        current_page = Paginator(all_articles, 10)

        # Pagination in django_bootstrap3 send response in this view:
        # "GET /?page=2 HTTP/1.0" 200,
        # So you need to pick up the page and try to pass it in Paginator, to find the page
        page = request.GET.get('page')
        try:
            # If there is, then choose this page
            context['article_lists'] = current_page.page(page)  
        except PageNotAnInteger:
            # If None, then select the first page
            context['article_lists'] = current_page.page(1)  
        except EmptyPage:
            # If you have gone beyond the last page, it returns the last
            context['article_lists'] = current_page.page(current_page.num_pages) 

        return render_to_response('home/index.html', context)

Information about URL-pattern

from django.conf.urls import url

from . import views

app_name = 'home'
urlpatterns = [
    url(r'^$', views.EIndexView.as_view(), name='index'),
]

Custom page template

The template is inherited from home/base.html which contains header information, etc., which are not interesting in this case.

In fact, in the context of the object has been transferred Paginator with selected pages and then as a regular queryset objects through the loop deployed in tape articles.

But the most interesting thing is that the more we load the module and insert bootstrap3 bootstrap_pagination, passing it as a context the same article_lists .

{% extends 'home/base.html' %}
{% block page %}
    <h1>Publications</h1>
    {% if article_lists %}
        {% for article in article_lists %}
            <article>
                <a href="{{ article.get_absolute_url }}">
                    <h2>{{ article.article_title }}</h2>
                </a>
                {{ article.desctription|safe }}
                <p><a class="btn btn-default btn-sm" href="{{ article.get_absolute_url }}">Read more</a></p>
                {% include 'knowledge/article_footer.html' %}
            </article>
        {% endfor %}
    {% endif %}
{% load bootstrap3 %}
{% bootstrap_pagination article_lists %}
{% endblock %}

For Django I recommend VDS-server of Timeweb hoster .

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Как вы в своем шаблоне сделали в пагинации отображение 5 страниц потом ... и последние страницы?

Я тоже так хочу сделать, но у меня пока что все страницы выводит. Вот мой код в шаблоне

														<div class="col-xs-5">
															<div class="pagination">
																<ul>
                                                                    {% if product.has_previous %}
																	<li><a href="?page=1{{ product.previous.num_pages }}"><|</a></li>
																	<li><a href="?page={{ product.previous_page_number }}"><</a></li>
                                                                    {% endif %}

                                                                    {% for i in product.paginator.page_range %}
                                                                      {% if product.number == i %}
                                                                        <li class="active"><a href="">{{ i }}</a></li>
                                                                      {% else %}
                                                                        <li><a href="?page={{ i }}">{{ i }}</a></li>
                                                                      {% endif %}
                                                                    {% endfor %}

                                                                    {% if product.has_next %}
																	<li><a href="?page={{ product.next_page_number }}">></a></li>
																	<li><a href="?page={{ product.paginator.num_pages }}">>|</a></li>
                                                                    {% endif %}
																</ul>
														    </div>
														</div>

я использую django-bootstrap4 и там уже есть эта возможность, поэтому выглядеть будет так в коде

{% bootstrap_pagination article_lists pages_to_show=5 %}

Просто поиграйтесь со значением pages_to_show

спасибо, получилось у меня на bootstrap3 тоже самое.

Плохо, что нет возможности отредактировать свой пост после публикации я там не правильно выбрал стиль кода.

я добавлю редактирование ))) просто сейчас занят совсем другим функционалом. Для добавления редактирования нужно разработать единый механизм, который бы позволял использовать один Дженерик для разных типов контента, поскольку таких комментариев под разными видами контента будет тьма.

понятно.
Еще вопрос по пагинации. У меня она работает, но я так и не понял, как у вас меняется страница автоматом т.е. если сейчас выведено с 1 по 5 то после нажатия на 4 автоматом справа появляется 5? У меня сейчас в этом же порядке, чтоб попасть на 5 нужно нажать на три точки блин ...

Не понял вопроса... В смысле меняется без перезагрузки всей страницы? или что именно?

Я гляну код, как на сайте сделано, но после работы. я не помню всех параметров которые там прописываю... Хотя того, что я вам написал должно быть достаточно...

У меня как бы тоже при выведенных от 1 до 4 нужно нажать на три точки, чтобы попасть на 5ю страницу.


У вас после нажатия на 4стр. 5 появляется сразу после обновления страницы. А у меня после нажатия на 4стр. и обновления страницы 5 не появляется а только ... и поэтому, что перейти на страницу 5 мне нужно нажать на многоточее.
Т.е. у вас не нужно нажимать на ... т.к. следующая цифра страницы сразу появляется. Вот как это работает пока не понял.

Полагаю, что у вас отсутствует компонент page или каким-то образом номер страницы неправильно устанавливается... Либо, возможно имеете забагованную версию django-bootstrap3, тоже может быть ...

у меня сейчас так в коде шаблона, не знаю у вас так же или нет? или я может чет упустил?

покажите python код, больше похоже на то, что у вас сам объект products корявый

вот эта функция, делал по документации джанго

def shop(request):
    context = {}
    products = Product.objects.filter(is_active=True)
    brands = Brand.objects.all()
    paginator = Paginator(products, 1)
    page = request.GET.get('page')
    products = paginator.get_page(page)
    context['products'] = products
    context['brands'] = brands
    return render(request, 'shop/shop.html', context)

хм... я гляну после работы, что у меня там в коде есть, я для пагинации уже давно дженерик написал и код для пагинации уже не пишу, поэтому там, возможно, есть нюанс, о котором я забыл, который касается django-bootstrap*.


ага, спасибо буду ждать ответ.

Погоди-те как... А вас шаблон неправильный...

<div class="pagination">

Там точно не нужен, поскольку bootstrap_pagination генерирует всё, что нужно.

Вот минимально рабочий вариант пагинатора со списком объектов

<div id="articles-list">
    {% load bootstrap_pagination from bootstrap3 %}
    {% for article in object_list %}
        {% include 'knowledge/article_preview.html' %}
    {% endfor %}
    {% bootstrap_pagination object_list pages_to_show="10" %}
</div>

Код взят вот из этой статьи


У вас на той странице написано

article_preview.html - этот шаблон рассматривать не будем, поскольку он не интересен для нас в данном случае
наверно как раз это самое интересное будет в моем случае, могу предположить, что там сам код пагинации, по которому проходит итерация. Можно его посмотреть?

Нету там никакой пагинации от слова - "совсем". Там просто кусок шаблона который отвечает за отрисовку превью одного объекта статьи.

Вот в этой одной строчке вся пагинация

{% bootstrap_pagination object_list pages_to_show="10" %}


понял, ок пошаманю еще немного, если не получиться то и фиг с ним так тоже вполне сойдет.

В общем добился я такого эффекта в пагинации как у вас след.образом. У меня в категории к примеру 8 записей, вот чтоб пагинация так работала нужно в {% bootstrap_pagination products pages_to_show=4 %} поставить ровно половину т.е. скрывать 4стр. Теперь получается, что видимых 5стр. и если нажать на 5 то 6-я автоматом и появляется и т.д. как у вас.
Спасибо за помощь!

А, вот в чём дело было... получается, что у вас просто контента не хватало, чтобы был задействован весь функционал пагинатора

получается да, сейчас делаю новый проект и пока много не добавлял контента так чисто для проверки и тестов, но когда ограничил ровно на половину, то заработало как надо.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
n
June 5, 2020, 2:28 a.m.
n1k0m1

Qt - Test 001. Signals and slots

  • Result:0points,
  • Rating points-10
s
June 3, 2020, 1:56 a.m.
silo1995

C++ - Тест 003. Условия и циклы

  • Result:35points,
  • Rating points-10
AP
June 2, 2020, 9:11 p.m.
Aleksej Pikenin

C++ - Test 005. Structures and Classes

  • Result:75points,
  • Rating points2
Last comments
June 5, 2020, 10:52 a.m.
progammist

Распознавание изображений на Python с помощью TensorFlow и Keras

Огромное спасибо за метериал, по-больше бы подобных статей (с подробным описанием работы и примерами применения) на тему современных технологий. Вопрос поразмышлять. На текущий момент реал…
June 5, 2020, 1:39 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

По-моему, смысла в этом нет особого. Если делегат будет игнорировать настройки таблицы, то это приведёт ещё к большему непониманию, что вообще происходит, для программиста, который после вас буд…
June 5, 2020, 1:34 a.m.
IscanderChe

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Сижу, размышляю: можно ли переписать делегата так, чтобы независимо от настроек строк выделялись строки?
June 5, 2020, 1:31 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Понятно. Я не обратил внимания на то, что там было в старом коде по настройкам строк :)
Now discuss on the forum
June 5, 2020, 6:13 a.m.
IscanderChe

Фильтр для QtableView sql

Добрый день. Для такой фильтрации необходимо использовать QSortFilterProxyModel. В оффдоках есть хороший пример.
MA
June 4, 2020, 2:46 a.m.
Mihail A

Qt- C++ QTableView подсветить строку

Спасибо.
f
June 3, 2020, 1:49 a.m.
fryn3

Можно ли сделать в QML таблицу как в Excel?

edi-tableview - нашел пока такое выглядит коряво, посмотрим что можно сделать
June 2, 2020, 2:46 a.m.
Evgenij Legotskoj

Медиа файлы Google Firebase

Картинки можете попробовать сжимать через QPixmap, там есть возможность установки scaleFactor, через него можете устанавливать нужные параметры. А что касается конвертации видео, то лучше п…
June 2, 2020, 2:01 a.m.
Evgenij Legotskoj

Перехват обращения к локальным файлам QWebEngineView

В вашем случае вполне адекватное решение. Так сказать меньше зло. В противном случае пришлось бы очень много переписывать и перепиливать.
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB