قالب های صفحه بندی با قابلیت استفاده مجدد
سلام
مشابه با آنچه در خصوص قالب form.html انجام شد؛ می توانیم تغییرات مشابهی را برای صفحه بندی و شماره گذاری صفحات انجام دهیم.
برای این کار ابتدا صفحات پست های یک تاپیک را صفحه گذاری کرده و سپس دنبال راهی برای قابلیت استفاده مجدد در کامپوننت صفحه بندی پیدا می کنیم.
boards/views.py (مشاهده کد کامل)
class PostListView(ListView):
model = Post
context_object_name = 'posts'
template_name = 'topic_posts.html'
paginate_by = 2
def get_context_data(self, **kwargs):
self.topic.views += 1
self.topic.save()
kwargs['topic'] = self.topic
return super().get_context_data(**kwargs)
def get_queryset(self):
self.topic = get_object_or_404(Topic, board__pk=self.kwargs.get('pk'), pk=self.kwargs.get('topic_pk'))
queryset = self.topic.posts.order_by('created_at')
return queryset
بروز رسانی urls.py به شکل زیر: (مشاهده کد کامل)
from django.conf.urls import url
from boards import views
urlpatterns = [
# ...
url(r'^boards/(?P<pk>\d+)/topics/(?P<topic_pk>\d+)/$', views.PostListView.as_view(), name='topic_posts'),
]
حالا قطعه کد html مربوط به قطعه بندی را از قالب topics.html در اختیار داریم و فایل جدیدی با نام pagination.html را درون فولدر templates/includes در کنار فایل forms.html ایجاد می کنیم.
myproject/ |-- myproject/ | |-- accounts/ | |-- boards/ | |-- myproject/ | |-- static/ | |-- templates/ | | |-- includes/ | | | |-- form.html | | | +-- pagination.html <-- here! | | +-- ... | |-- db.sqlite3 | +-- manage.py +-- venv/
templates/includes/pagination.html
{% 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 %}
حالا در قالب topic_posts.html از آن استفاده می کنیم.
templates/topic_posts.html (مشاهده کد کامل)
{% block content %}
<div class="mb-4">
<a href="{% url 'reply_topic' topic.board.pk topic.pk %}" class="btn btn-primary" role="button">Reply</a>
</div>
{% for post in posts %}
<div class="card {% if forloop.last %}mb-4{% else %}mb-2{% endif %} {% if forloop.first %}border-dark{% endif %}">
{% if forloop.first %}
<div class="card-header text-white bg-dark py-2 px-3">{{ topic.subject }}</div>
{% endif %}
<div class="card-body p-3">
<div class="row">
<div class="col-2">
<img src="{% static 'img/avatar.svg' %}" alt="{{ post.created_by.username }}" class="w-100">
<small>Posts: {{ post.created_by.posts.count }}</small>
</div>
<div class="col-10">
<div class="row mb-3">
<div class="col-6">
<strong class="text-muted">{{ post.created_by.username }}</strong>
</div>
<div class="col-6 text-right">
<small class="text-muted">{{ post.created_at }}</small>
</div>
</div>
{{ post.message }}
{% if post.created_by == user %}
<div class="mt-3">
<a href="{% url 'edit_post' post.topic.board.pk post.topic.pk post.pk %}"
class="btn btn-primary btn-sm"
role="button">Edit</a>
</div>
{% endif %}
</div>
</div>
</div>
</div>
{% endfor %}
{% include 'includes/pagination.html' %}
{% endblock %}
حواستان باشد که تغییرات لازم را در حلقۀ for ایجاد می کنیم:
{% for post in posts %}
همچنین می توانیم قالب قبلی را به روز رسانی کنیم. یعنی قالب را برای استفاده از قالب صفحه بندی.
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 code suppressed -->
</table>
{% include 'includes/pagination.html' %}
{% endblock %}
برای تست صحت قالب کافی است چند پست را به این تاپیک اضافه کرده و خروجی را چک کنیم.

فایل تست را بروز رسانی می کنیم.
boards/tests/test_view_topic_posts.py (مشاهده کد کامل)
from django.test import TestCase
from django.urls import resolve
from ..views import PostListView
class TopicPostsTests(TestCase):
# ...
def test_view_function(self):
view = resolve('/boards/1/topics/1/')
self.assertEquals(view.func.view_class, PostListView)
ترجمۀ اختصاصی توسط تمدن
مطلب بعدی: ویوی حساب کاربری
مطلب قبلی: صفحه بندی با استفاده از GCBV

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