Die Anzahl der Artikel auf der neuen Site näherte sich langsam 10, daher füge ich dringend Pagination hinzu, damit ich die Seiten auf der Site durchblättern kann. Da aber das Modul django-bootstrap3 bereits verwendet wird, wird Pagination von diesem Modul verwendet. Warum die zusätzliche Arbeit, wenn alles fertig ist? Oder.
Um Pagination hinzuzufügen, benötigen Sie:
- Verwenden Sie die Paginator Klasse von django.core.pagination;
- Fügen Sie Bootstrap \ _pagination mit Anker zum Template der Hauptseite hinzu;
- Fügen Sie eine Überprüfung der aktuellen Seitenzahl hinzu;
- Und ... fügen Sie den URL-Vorlagen nichts Neues hinzu.
Paginator zur Ansicht hinzufügen
Paginator ist eine Klasse, die die aktuelle Seite enthält, die geladen wird, wenn die Methode page() aufgerufen wird, an die die Seitennummer als Argument übergeben wird. In unserem Fall versuchen wir, die Nummer dieser Seite zu ermitteln, falls vorhanden, zeigen wir die Seite an, oder wenn wir die Anzahl der Seiten überschritten haben, zeigen wir die letzte an. Wenn die Nummern nicht übertragen wurden, senden wir die erste Seite zurück.
from django.shortcuts import render_to_response from django.views import View from django.core.paginator import Paginator from knowledge.models import * # Представление сделано на основе класса View class EIndexView(View): def get(self, request): context = {} # Забираем все опубликованные статье отсортировав их по дате публикации all_articles = Article.objects.filter(article_status=True).order_by('-article_date') # Создаём Paginator, в который передаём статьи и указываем, # что их будет 10 штук на одну страницу current_page = Paginator(all_articles, 10) # Pagination в django_bootstrap3 посылает запрос вот в таком виде: # "GET /?page=2 HTTP/1.0" 200, # Поэтому нужно забрать page и попытаться передать его в Paginator, # для нахождения страницы page = request.GET.get('page') try: # Если существует, то выбираем эту страницу context['article_lists'] = current_page.page(page) except PageNotAnInteger: # Если None, то выбираем первую страницу context['article_lists'] = current_page.page(1) except EmptyPage: # Если вышли за последнюю страницу, то возвращаем последнюю context['article_lists'] = current_page.page(current_page.num_pages) return render_to_response('home/index.html', context)
Informationen zu URL-Mustern
Wie gesagt, ich habe das URL-Muster nicht geändert, aber ich werde es geben, damit es keine Verwechslungen gibt.
from django.conf.urls import url from . import views app_name = 'home' urlpatterns = [ url(r'^$', views.EIndexView.as_view(), name='index'), ]
Anpassen der Seitenvorlage
Das Template erbt von home/base.html und enthält Header-Informationen etc., was in diesem Fall nicht interessant ist.
Tatsächlich wurde das Paginator Objekt mit den ausgewählten Seiten an den Kontext übergeben und dann, wie ein normales Queryset , Objekte durch eine Schleife in den Artikel-Feed erweitert.
Aber das Interessanteste ist, dass wir als nächstes das Bootstrap3-Modul laden und Bootstrap \ _pagination einfügen, wobei wir dieselben ** article \ _lists übergeben.
{% extends 'home/base.html' %} {% block page %} <h1>Публикации</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 }}">Читать далее</a></p> {% include 'knowledge/article_footer.html' %} </article> {% endfor %} {% endif %} {% load bootstrap3 %} {% bootstrap_pagination article_lists %} {% endblock %}
Für Django empfehle ich Timeweb Hosting VDS Server .
Как вы в своем шаблоне сделали в пагинации отображение 5 страниц потом ... и последние страницы?
Я тоже так хочу сделать, но у меня пока что все страницы выводит. Вот мой код в шаблоне
я использую django-bootstrap4 и там уже есть эта возможность, поэтому выглядеть будет так в коде
Просто поиграйтесь со значением pages_to_show
спасибо, получилось у меня на bootstrap3 тоже самое.
Плохо, что нет возможности отредактировать свой пост после публикации я там не правильно выбрал стиль кода.
я добавлю редактирование ))) просто сейчас занят совсем другим функционалом. Для добавления редактирования нужно разработать единый механизм, который бы позволял использовать один Дженерик для разных типов контента, поскольку таких комментариев под разными видами контента будет тьма.
понятно.
Еще вопрос по пагинации. У меня она работает, но я так и не понял, как у вас меняется страница автоматом т.е. если сейчас выведено с 1 по 5 то после нажатия на 4 автоматом справа появляется 5? У меня сейчас в этом же порядке, чтоб попасть на 5 нужно нажать на три точки блин ...
Не понял вопроса... В смысле меняется без перезагрузки всей страницы? или что именно?
Я гляну код, как на сайте сделано, но после работы. я не помню всех параметров которые там прописываю... Хотя того, что я вам написал должно быть достаточно...
У меня как бы тоже при выведенных от 1 до 4 нужно нажать на три точки, чтобы попасть на 5ю страницу.
У вас после нажатия на 4стр. 5 появляется сразу после обновления страницы. А у меня после нажатия на 4стр. и обновления страницы 5 не появляется а только ... и поэтому, что перейти на страницу 5 мне нужно нажать на многоточее.
Т.е. у вас не нужно нажимать на ... т.к. следующая цифра страницы сразу появляется. Вот как это работает пока не понял.
Полагаю, что у вас отсутствует компонент page или каким-то образом номер страницы неправильно устанавливается... Либо, возможно имеете забагованную версию django-bootstrap3, тоже может быть ...
у меня сейчас так в коде шаблона, не знаю у вас так же или нет? или я может чет упустил?
покажите python код, больше похоже на то, что у вас сам объект products корявый
вот эта функция, делал по документации джанго
хм... я гляну после работы, что у меня там в коде есть, я для пагинации уже давно дженерик написал и код для пагинации уже не пишу, поэтому там, возможно, есть нюанс, о котором я забыл, который касается django-bootstrap*.
ага, спасибо буду ждать ответ.
Погоди-те как... А вас шаблон неправильный...
Там точно не нужен, поскольку bootstrap_pagination генерирует всё, что нужно.
Вот минимально рабочий вариант пагинатора со списком объектов
Код взят вот из этой статьи
У вас на той странице написано
article_preview.html - этот шаблон рассматривать не будем, поскольку он не интересен для нас в данном случае
наверно как раз это самое интересное будет в моем случае, могу предположить, что там сам код пагинации, по которому проходит итерация. Можно его посмотреть?
Нету там никакой пагинации от слова - "совсем". Там просто кусок шаблона который отвечает за отрисовку превью одного объекта статьи.
Вот в этой одной строчке вся пагинация
понял, ок пошаманю еще немного, если не получиться то и фиг с ним так тоже вполне сойдет.
В общем добился я такого эффекта в пагинации как у вас след.образом. У меня в категории к примеру 8 записей, вот чтоб пагинация так работала нужно в {% bootstrap_pagination products pages_to_show=4 %} поставить ровно половину т.е. скрывать 4стр. Теперь получается, что видимых 5стр. и если нажать на 5 то 6-я автоматом и появляется и т.д. как у вас.
Спасибо за помощь!
А, вот в чём дело было... получается, что у вас просто контента не хватало, чтобы был задействован весь функционал пагинатора
получается да, сейчас делаю новый проект и пока много не добавлял контента так чисто для проверки и тестов, но когда ограничил ровно на половину, то заработало как надо.
а как быть если нет базы и запроса в БД, а данные приходят по запросу в api стороннего сервера, а клиент серверное приложение на django и я хочу реализовать пагинацию на стороне django. В апи я могу пердвать limit, offset, и получать count всех записей
Что тогда нужно передавать в класс пагинатора (вместо all_articles) как тут
кроме количества записей на страницы и как в дальнейшем делать запрос что бы пагинатор работал правильно
Просто список каких-нибудь объектов передавайте, который дёрнули ищ api стороннего сервера