Реклама

Добавление Pagination на основе django-bootstrap3

TutorialDjangoPagination, Python, django-bootstrap3454

Количество статей на новом сайте начало приближаться к 10 штукам, поэтому в срочном порядке добавляю Pagination, чтобы была возможность пролистывать страницы на сайте. Но поскольку уже используется модуль django-bootstrap3, то и Pagination будет использоваться из этого модуля. Зачем же делать лишнюю работу, когда уже всё сделано? Не так ли.

Для добавления Pagination необходимо:

  1. Использовать класс Paginator из django.core.pagination;
  2. Добавить в шаблон главной страницы bootstrap_pagination с привязкой ;
  3. Добавить проверку текущего номера страницы;
  4. И ... не добавлять ничего нового в шаблоны url.  

Добавляем Paginator в представление

Paginator - это класс, который содержит текущую страницу, которая загружается при вызове метода page(), которому в качестве аргумента будет передан номер страницы. В нашем случае мы попытаемся забрать номер данной страницы, если он существует, то отобразим страницу или если вышли за количество страниц, то отобразим последнюю. Если номера не был передан, то вернём первую страницу.

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)

Информация по URL-шаблону

Как я и говорил, я не менял шаблон url, но приведу его, чтобы не было непоняток.

from django.conf.urls import url

from . import views

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

Кастомизируем шаблон страницы

Шаблон наследован от home/base.html и содержит заголовочную информацию и т.д., которая не интересна в данном случае.

По сути в контекст был передан объект Paginator с выбранными страницами и далее, как обычный queryset объектов через цикл развёрнут в ленту статей.

Но самое интересное то, что дальше мы загружаем модуль bootstrap3 и вставляем bootstrap_pagination, передавая ему в качестве контекста этот же самый article_lists.

{% 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 %}
@EVILEG 21 сентября 2016 г. 22:12

Реклама

Реклама

Комментарии

Комментарии

Только авторизованные пользователи могут оставлять комментарии.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь

Реклама

Реклама