قالب های صفحه بندی با قابلیت استفاده مجدد
سلام
مشابه با آنچه در خصوص قالب 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
دیدگاه خود را ثبت کنید
تمایل دارید در گفتگو شرکت کنید؟نظری بدهید!