Pagination در Django: راهنمای کامل صفحه‌بندی داده‌ها با Paginator، ListView و Viewهای تابعی

این مقاله سیستم Pagination در Django را توضیح می‌دهد. موضوعاتی مانند کلاس Paginator، نحوهٔ تقسیم داده‌ها به صفحات، ویژگی‌ها و متدهای Page object، صفحه‌بندی در ListView، و استفاده از Paginator در viewهای تابعی بررسی می‌شوند.

Pagination Django، صفحه‌بندی جنگو، Paginator، Page objectListView paginationget_page، paginate_by

~3 دقیقه مطالعه • بروزرسانی ۲۴ اسفند ۱۴۰۴

مقدمه

Pagination یا صفحه‌بندی یکی از نیازهای رایج در وب‌اپلیکیشن‌هاست؛ مخصوصاً زمانی که داده‌ها زیاد هستند و باید در چند صفحه نمایش داده شوند. Django ابزارهای سطح بالا و سطح پایین برای مدیریت صفحه‌بندی ارائه می‌دهد. در قلب این سیستم، کلاس Paginator قرار دارد.


کلاس Paginator

کلاس Paginator مسئول تقسیم داده‌ها به صفحات است. این داده‌ها می‌توانند:

  • لیست یا tuple
  • QuerySet جنگو
  • هر شیء دارای count() یا __len__()

مثال پایه


from django.core.paginator import Paginator

objects = ["john", "paul", "george", "ringo"]
p = Paginator(objects, 2)

ویژگی‌های مهم:

  • p.count → تعداد کل آیتم‌ها
  • p.num_pages → تعداد صفحات
  • p.page_range → بازهٔ صفحات

دریافت یک صفحه


page1 = p.page(1)
page1.object_list  # ['john', 'paul']

متدهای Page object

  • has_next()
  • has_previous()
  • has_other_pages()
  • next_page_number()
  • previous_page_number()
  • start_index()
  • end_index()

اگر شمارهٔ صفحه نامعتبر باشد، خطای EmptyPage رخ می‌دهد.


صفحه‌بندی در ListView

کلاس ListView به‌صورت داخلی از Paginator پشتیبانی می‌کند. برای فعال‌سازی صفحه‌بندی کافی است paginate_by را تنظیم کنید.


from django.views.generic import ListView
from myapp.models import Contact

class ContactListView(ListView):
    paginate_by = 2
    model = Contact

این کار دو متغیر به context اضافه می‌کند:

  • paginator
  • page_obj

نمونهٔ قالب (template)


{% for contact in page_obj %}
    {{ contact.full_name|upper }}
{% endfor %}

استفاده از Paginator در Viewهای تابعی

می‌توانید Paginator را مستقیماً در viewهای معمولی استفاده کنید.


from django.core.paginator import Paginator
from django.shortcuts import render
from myapp.models import Contact

def listing(request):
    contact_list = Contact.objects.all()
    paginator = Paginator(contact_list, 25)

    page_number = request.GET.get("page")
    page_obj = paginator.get_page(page_number)
    return render(request, "list.html", {"page_obj": page_obj})

در قالب list.html می‌توانید همان کد صفحه‌بندی ListView را استفاده کنید.


جمع‌بندی

Pagination در Django بسیار ساده و قدرتمند است. با استفاده از Paginator، ListView و get_page() می‌توانید داده‌های حجیم را به‌صورت صفحه‌بندی‌شده نمایش دهید و تجربهٔ کاربری بهتری ایجاد کنید.

نوشته و پژوهش شده توسط دکتر شاهین صیامی