{}
Django: Постраничный вывод

При показе списка чего бы то ни было , как правило, идет разбиение этого списка на страницы.
Для решения этой задачи в Django существует стандартный пагинатор. Рассмотрим пример, где нужно получить список  статей для выбранного раздела и затем вывести их постранично. 
Для решения данной задачи использован базовый класс предствалений ListView.
Также нам поможет пакет bootstrap3 совместо с приложением для Django. Как установить этот пакет и что он может делать - будет рассказано в отдельной статье.
Этот пример - полностью рабочий. 


Модель  models.py


from __future__ import unicode_literals
from django.db import models
from django.contrib import admin
from django.utils import timezone
from rte import RTEField


class Razdel(models.Model):
name = models.CharField(max_length=50, unique = True)


class Article(models.Model):
    title = models.CharField(max_length=150,verbose_name = 'Название статьи')
    body = RTEField(default = '')
    timestamp = models.DateTimeField(default = timezone.now, db_index = True, verbose_name = "Опубликована")
    razdel = models.ForeignKey(Razdel,on_delete=models.SET_NULL,blank=True,null=True,verbose_name = 'Раздел')


     def get_absolute_url(self):
         return reverse('article', args=[str(self.id)])


Представление views.py


from __future__ import unicode_literals
from .models import Article, Razdel
from django.views.generic import ListView, DetailView
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django import forms


class ListArticles(ListView):
    template_name = 'articles.html'
    model = Article
     
    def get_context_data(self, **kwargs):
        context = super(ListArticles, self).get_context_data(**kwargs)
        page = self.request.GET.get("page")
      
          razdel_id = self.kwargs.get('razdel',0)
        articles = Article.objects.filter(razdel=razdel_id)
        current_page = Paginator(articles, 4)


      try:
           context['articles'] = current_page.page(page)  
        except PageNotAnInteger:
           context['articles'] = current_page.page(1)  
        except EmptyPage:
           context['articles'] = current_page.page(current_page.num_pages)
             
        context['curr_razdel'] = Razdel.objects.get(id=razdel_id)
        return context


Менеджер URL urls.py


from django.conf.urls import url
from . import views
from . import models
 
urlpatterns = [
   url(r'^(?P<razdel>\d+)/',views.ListArticles.as_view(),name='articles'),
   url(r'^article/(?P<pk>\d+)/$',views.ArticleDetailView.as_view(),name='article'),
    ]


Показ списка статей в шаблоне  articles.html


<div>
      <div>Список статей из раздела : <span> {% for razd in curr_razdel %}{{razd.name}}</span>{% endfor %}</div>
      <div>
        {% for article in articles %}
        <div class = "list-group-item"><a  href = "{{ article.get_absolute_url }} ">{{article.title}}</a></div>
        {% endfor %}
        <div>{% bootstrap_pagination articles %}</div>
      </div>
 </div>
</div>