Mongodb kullananlar django’nun kendi paginatorunu kullandıklarında performans sorunları yaşıyor olabilirler, bu kod ile bu sorunu ortadan kaldırabilirsiniz. Kullanmayı bıraktığımız bu güzel kodumuz sizlerle.
Kendinize göre uyarlamayı ihmal etmeyin, kodumuzda sayfa kaldığı yerden devam etsin diye ufak tefek değişiklikler yapılmıştır.
def mongo_paginator(request, data, paginate_by):
page = int(request.GET.get("page", 1))
if len(request.GET) > 0:
get_value = dict(request.GET)
if get_value.get("page"):
del get_value["page"]
url = "?" + str(urlencode(get_value, doseq=True)) + "&page="
else:
url = "?page="
row_count = int(data.count())
page_count = int(row_count / paginate_by) + \
1 if row_count > paginate_by else 1
pagi = {
"page_range": range(1, page_count+1),
"has_other_pages": page_count > 1,
"number": page,
"has_previous": page > 1,
"previous_page_number": page - 1,
"has_next": page < page_count,
"next_page_number": page + 1,
"url": url,
}
if request.GET.get("page"):
if page > 1:
first = paginate_by * (page - 1)
last = first + paginate_by
data = data[first:last]
elif page == 1:
data = data[:paginate_by]
else:
data = data[:paginate_by]
return {"data": data, "pagi": pagi}
BONUS
def paginate(queryset, request, paginate_by):
paginator = Paginator(queryset, paginate_by)
try:
datum = paginator.page(request.GET.get("page"))
except PageNotAnInteger:
datum = paginator.page(1)
except EmptyPage:
datum = paginator.page(paginator.num_pages)
return datum
def get_page_url(request):
if len(request.GET) > 1:
get_value = dict(request.GET)
if get_value.get("page"):
del get_value["page"]
url = "?" + str(urlencode(get_value, doseq=True)) + "&page="
else:
url = "?page="
return url