صفحه بندی با استفاده از 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

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

0 پاسخ

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

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

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

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