При показе списка чего бы то ни было , как правило, идет разбиение этого списка на страницы.
Для решения этой задачи в 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>