صفحه بندی با استفاده از GCBV
سلام
در ادامه پیاده سازی مشابهی را و البته با استفاده از ListView می بینیم.
boards/views.py (مشاهده کد کامل)
class TopicListView(ListView):
model = Topic
context_object_name = 'topics'
template_name = 'topics.html'
paginate_by = 20
def get_context_data(self, **kwargs):
kwargs['board'] = self.board
return super().get_context_data(**kwargs)
def get_queryset(self):
self.board = get_object_or_404(Board, pk=self.kwargs.get('pk'))
queryset = self.board.topics.order_by('-last_updated').annotate(replies=Count('posts') - 1)
return queryset
تعامل با paginator در قالب برنامه متفاوت از روش عادی و مبتنی بر توابع است. در قالب، متغیرهای زیر قابل دسترسی اند:
paginator, page_obj, is_paginated, object_list و همچنین متغیری که نام آن را در context_object_name تعریف کرده ایم. در این مورد این متغیرهای اضافه را topics نامگذاری می کنیم که معادل object_list خواهد بود.
و اما get_context_data شیوه ای است که برای اضافه کردن چیزهای مختلف به request در زمان توسعه یک GCBV استفاده می شود.
نکتۀ اساسی در این میان مربوط به ویژگی paginate_by است. در برخی از موارد صرفاً اضافه کردن آن به برنامه کافی است. فراموش نکنید که فایل urls.py نیز نیاز به بروز رسانی دارد.
myproject/urls.py (مشاهده کد کامل)
from django.conf.urls import url
from boards import views
urlpatterns = [
# ...
url(r'^boards/(?P<pk>\d+)/$', views.TopicListView.as_view(), name='board_topics'),
]
حالا قالب را درست می کنیم.
templates/topics.html(مشاهده کد کامل)
{% block content %}
<div class="mb-4">
<a href="{% url 'new_topic' board.pk %}" class="btn btn-primary">New topic</a>
</div>
<table class="table mb-4">
<!-- table content suppressed -->
</table>
{% if is_paginated %}
<nav aria-label="Topics pagination" class="mb-4">
<ul class="pagination">
{% if page_obj.has_previous %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.previous_page_number }}">Previous</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link">Previous</span>
</li>
{% endif %}
{% for page_num in paginator.page_range %}
{% if page_obj.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 page_obj.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.next_page_number }}">Next</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link">Next</span>
</li>
{% endif %}
</ul>
</nav>
{% endif %}
{% endblock %}
و حالا هم زمان رسیدگی به فایل تست و ایجاد تغییرات لازم :
boards/tests/test_view_board_topics.py
from django.test import TestCase
from django.urls import resolve
from ..views import TopicListView
class BoardTopicsTests(TestCase):
# ...
def test_board_topics_url_resolves_board_topics_view(self):
view = resolve('/boards/1/')
self.assertEquals(view.func.view_class, TopicListView)
ترجمۀ اختصاصی توسط تمدن
مطلب بعدی:قالب های صفحه بندی با قابلیت استفاده مجدد
مطلب قبلی: صفحه بندی با استفاده از FBV

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