Django MongoDB Paginator

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
Share this:

Leave a Comment

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.