Skip to content

Instantly share code, notes, and snippets.

@rdandy
Created September 11, 2014 03:22
Show Gist options
  • Save rdandy/3d5aacc77e062a5d6a15 to your computer and use it in GitHub Desktop.
Save rdandy/3d5aacc77e062a5d6a15 to your computer and use it in GitHub Desktop.
paginator for objects, add page parameter in url, json response
# paginator objects and page parameter in url
from django.http import HttpResponse
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
import json
AMOUNT_PER_PAGE = 10
def someview(request):
data = request.GET
page = data.get('page', None)
amount_per_page = data.get('amount_per_page', str(AMOUNT_PER_PAGE))
try:
page = int(page)
except:
page = 1
query_objects = SomeModel.objects.all()
paginator = Paginator(query_objects, amount_per_page)
total_count = paginator.count # total records
pages_count = paginator.num_pages # total pages
page = paginator.num_pages if page > paginator.num_pages else page
try:
objects = paginator.page(page)
except PageNotAnInteger:
page = 1
objects = paginator.page(page)
except EmptyPage:
objects = paginator.page(paginator.num_pages)
# url params
params = ''
data_tmp = data.copy()
if 'page' in data_tmp:
del data_tmp['page']
params = '&'.join(['%s=%s' % (param, data_tmp[param]) for param in data_tmp])
params = '?page=' if params == '' else '?%s%s' % (params, '&page=')
url = '%s://%s%s%s' % ('http' if settings.DEBUG else 'https', request.get_host(), request.path_info, params)
pages_data = {
'total_pages': paginator.num_pages,
'total_records': paginator.count,
'next': ('%s%s' % (url, objects.next_page_number())) if objects.has_next() else '',
'prev': ('%s%s' % (url, objects.previous_page_number())) if objects.has_previous() else '',
}
result = {
'pages_data': pages_data,
'success': True if else False,
'items': [x for x in query_objects],
'msg': 'success' if query_objects else 'no data',
}
return HttpResponse(json.dumps(result), content_type='application/json; charset="utf-8"')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment