Created
September 11, 2014 03:22
-
-
Save rdandy/3d5aacc77e062a5d6a15 to your computer and use it in GitHub Desktop.
paginator for objects, add page parameter in url, json response
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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