Date-based generic views do not provide pagination by default but Django is very extensible. It provides a Paginator that takes care of pagination. Since date based views usually order by descending order ie from latest entry to the oldest, I used a queryset to order the items (on a field called 'date_pub') and then pass this queryset to the paginator which takes care of the pagination.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | from django.core.paginator import Paginator
from django.views.generic.list_detail import object_list
from django.http import Http404
from django.shortcuts import get_list_or_404
from app_name.models import Model_Name
num_in_page = 5
# Pagination for the equivalent of archive_index generic view.
# The url is of the form http://host/page/4/
# In urls.py for example, ('^blog/page/(?P<page>\d)/$', get_archive_index),
def get_archive_index(request, page):
queryset = Model_Name.objects.order_by("-date_pub")
paginator = Paginator(queryset, num_in_page)
if int(page) in paginator.page_range:
return object_list(request, queryset, paginate_by=num_in_page, page=int(page))
# send a 404 error that page is not found.
return Http404
# Pagination for the equivalent of archive_year generic view.
# The URL is of the form http://host/2007/page/1/
# urls.py,say, ('^blog/(?P<year>\d{4})/page/(?P<page>\d)/$',get_archive_year),
def get_archive_year(request, year, page):
queryset = get_list_or_404(Model_Name, date_pub__year=year)
paginator = Paginator(queryset, num_in_page)
if int(page) in paginator.page_range:
return object_list(request, queryset, paginate_by=num_in_page, page=int(page))
return Http404
# Pagination for the equivalent of archive_month generic view.
# The URL is of the form http://host/2007/10/page/2/
# ('^blog/(?P<year>\d{4})/(?P<month>\d{2})/page/(?P<page>\d)/$',get_archive_month),
def get_archive_month(request, year, month, page):
queryset = get_list_or_404(Model_Name, date_pub__year=year, date_pub__month=month)
paginator = Paginator(queryset, num_in_page)
if int(page) in paginator.page_range:
return object_list(request, queryset, paginate_by=num_in_page, page=int(page))
return Http404
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 10 months, 2 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 3 weeks ago
- Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
- Help text hyperlinks by sa2812 1 year, 7 months ago
Comments
Thanks. Will use your snippet.
#
Please login first before commenting.