صفحه بندی و شماره گذاری صفحات

سلام

این کار با استفاده از CBV بسیار آسان است. اما قبل از آن می خواهیم صفحه بندی مطالب را به صورت دستی انجام دهیم تا از مکانیسم واقعی آن آگاهی پیدا کنی و سپس از تکنولوژی CBV بهره برداری می کنیم.

از الآن به بعد روی ویوی board_topics کار می کنیم.

در مرحلۀ اول می خواهیم چند پست اضافه کنیم. برای این کار هم می توانیم قسمت کاربری را در برنامه باز و چند پست ایجاد کنیم و هم می توانیم با استفاده از شل پایتون و اسکریپت نویسی مختصر این کار را انجام دهیم:

python manage.py shell
from django.contrib.auth.models import User
from boards.models import Board, Topic, Post

user = User.objects.first()

board = Board.objects.get(name='Django')

for i in range(100):
    subject = 'Topic test #{}'.format(i)
    topic = Topic.objects.create(subject=subject, board=board, starter=user)
    Post.objects.create(message='Lorem ipsum...', topic=topic, created_by=user)

بسیار عالی! حالا یک سری داده برای بازی با آن ها داریم!

قبل از اینکه وارد کدزنی شویم کمی بیشتر با شل پایتون تفریح کنیم.

python manage.py shell
from boards.models import Topic

# All the topics in the app
Topic.objects.count()
۱۰۷

# Just the topics in the Django board
Topic.objects.filter(board__name='Django').count()
۱۰۴

# Let's save this queryset into a variable to paginate it
queryset = Topic.objects.filter(board__name='Django').order_by('-last_updated')

ذخیره سازی QuerySet برای صفحه بندی بسیار مهم است. در صورت عدم انجام این کار ممکن است نتایج متفاوت و اشتباهی را دریافت کنی.

خوب! حالا می خواهیم از ابزار paginator استفاده کنیم. (pagination به معنای صفحه بندی است.)

from django.core.paginator import Paginator

paginator = Paginator(queryset, 20)

در قطعه کد بالا به برنامه گفته ایم که کوئری ست ما را به گونه ای استفاده کن که در هر صفحه ۲۰ مورد قرار گیرد. حالا می خواهیم سایر امکانات paginator را مرور کنیم.

# count the number of elements in the paginator
paginator.count
۱۰۴

# total number of pages
# ۱۰۴ elements, paginating 20 per page gives you 6 pages
# where the last page will have only 4 elements
paginator.num_pages
۶

# range of pages that can be used to iterate and create the
# links to the pages in the template
paginator.page_range
range(1, 7)

# returns a Page instance
paginator.page(2)
<Page 2 of 6>

page = paginator.page(2)

type(page)
django.core.paginator.Page

type(paginator)
django.core.paginator.Paginator

در این قسمت لازم است که دقت کافی صورت پذیرد. مثلاً اگر بخواهیم به صفحه ای که وجود ندارد دسترسی پیدا کنیم؛ paginator خطا می دهد.

paginator.page(7)
EmptyPage: That page contains no results

یا اگر بخواهیم به جای شمارۀ صفحه پارامتر نامناسبی را وارد برنامه کنیم:

paginator.page('abc')
PageNotAnInteger: That page number is not an integer

پس لازم است در زمان طراحی واسط کاربری تمام این موارد را در ذهن داشته باشیم.

در ادامه به سایر توابع و امکانات برای صفحه بندی می پردازیم:

page = paginator.page(1)

# Check if there is another page after this one
page.has_next()
True

# If there is no previous page, that means this one is the first page
page.has_previous()
False

page.has_other_pages()
True

page.next_page_number()
۲

# Take care here, since there is no previous page,
# if we call the method `previous_page_number() we will get an exception:
page.previous_page_number()
EmptyPage: That page number is less than 1

ترجمۀ اختصاصی توسط تمدن

 

مطلب بعدی: صفحه بندی با استفاده از FBV

مطلب قبلی: ویوی لیست | List View

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگو شرکت کنید؟
نظری بدهید!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *