~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() میتوانید دادههای حجیم را بهصورت صفحهبندیشده نمایش دهید و تجربهٔ کاربری بهتری ایجاد کنید.
نوشته و پژوهش شده توسط دکتر شاهین صیامی