صفحه بندی با استفاده از FBV
سلام
کد زیر مربوط به پیاده سازی صفحه بندی با استفاده از توابع است.
boards/views.py (مشاهده کد کامل)
from django.db.models import Count
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import get_object_or_404, render
from django.views.generic import ListView
from .models import Board
def board_topics(request, pk):
board = get_object_or_404(Board, pk=pk)
queryset = board.topics.order_by('-last_updated').annotate(replies=Count('posts') - 1)
page = request.GET.get('page', 1)
paginator = Paginator(queryset, 20)
try:
topics = paginator.page(page)
except PageNotAnInteger:
# fallback to the first page
topics = paginator.page(1)
except EmptyPage:
# probably the user tried to add a page number
# in the url, so we fallback to the last page
topics = paginator.page(paginator.num_pages)
return render(request, 'topics.html', {'board': board, 'topics': topics})
حالا ترفند اصلی این است که صفحات را با استفاده از کامپوننت صفحه بندی در بوت استرپ ۴ نمایش دهیم. این کار زمان زیادی می برد و می توانید با مراجعه به کدهای آن متوجه چگونگی پیاده سازی اش شوید. در این پیاده سازی اتفاق خاصی نیفتاده و از همان متدهایی استفاده کرده ایم که در قبل با هم دیده ایم. ضمناً topics دیگر در نقش کوئریست نبوده و این کار را متغیر paginator.Page انجام می دهد.
درست بعد از جدول html مربوط به تاپیک ها می توانیم کامپوننت صفحه بندی را رندر کنیم.
templates/topics.html (مشاهده کد کامل)
{% if topics.has_other_pages %}
<nav aria-label="Topics pagination" class="mb-4">
<ul class="pagination">
{% if topics.has_previous %}
<li class="page-item">
<a class="page-link" href="?page={{ topics.previous_page_number }}">Previous</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link">Previous</span>
</li>
{% endif %}
{% for page_num in topics.paginator.page_range %}
{% if topics.number == page_num %}
<li class="page-item active">
<span class="page-link">
{{ page_num }}
<span class="sr-only">(current)</span>
</span>
</li>
{% else %}
<li class="page-item">
<a class="page-link" href="?page={{ page_num }}">{{ page_num }}</a>
</li>
{% endif %}
{% endfor %}
{% if topics.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ topics.next_page_number }}">Next</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link">Next</span>
</li>
{% endif %}
</ul>
</nav>
{% endif %}

ترجمۀ اختصاصی توسط تمدن
مطلب بعدی: صفحه بندی با استفاده از GCBV
مطلب قبلی: صفحه بندی و شماره گذاری صفحات

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