Pazar, Aralık 22, 2024

Django MongoDB Paginator

yüksek çözünürlüklü yeşil renkli orjinal django logosu

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