๋ฐ์ดํฐ๋ฅผ ํ์ด์ง๋ฅผ ๊ตฌ๋ถํด์ ์กฐํํ๋ ๋ก์ง์ด๋ ๋ชจ๋
Django๋ ํ์ด์ง๊ฐ ๋งค๊ฒจ์ง ๋ฐ์ดํฐ, ์ฆ "์ด์ /๋ค์" ๋งํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ํ์ด์ง์ ๊ฑธ์ณ ๋ถํ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ๋์์ด ๋๋ ์์ ์์ค ๋ฐ ํ์ ์์ค ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
Page Class๋ฅผ ์ฌ์ฉํด์ ํ์ด์ง๋ค์ด์ ์ ๊ตฌํํ ์ ์๋ค.
์ฐธ๊ณ ๋ฌธ์ - Django Pagination
django.views.generic.list.ListView
๋ ํ์๋ ๋ชฉ๋ก์ ํ์ด์ง๋ฅผ ๋งค๊ธฐ๋ ๊ธฐ๋ณธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ๋ทฐ ํด๋์ค์ paginate_by
์์ฑ์ ์ถ๊ฐํ๋ฉด ํ ํ์ด์ง๋น ๋ณด์ฌ์ง๋ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ์ง์ ํ ์ ์๋ค.from django.views.generic import ListView
from myapp.models import Contact
class ContactListView(ListView):
paginate_by = 2
model = Contact
{% for contact in page_obj %}
{# Each "contact" is a Contact model object. #}
{{ contact.full_name|upper }}<br>
...
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
page_obj
๋ผ๋ ์ด๋ฆ์ผ๋ก ์ดํฐ๋ ์ด์
์ ์ํํด์ผ ์ ์์ ์ผ๋ก ํ์ด์ง๋ค์ด์
์ด ๊ตฌํ์ด ๋๋ค.from django.core.paginator import Paginator
from django.shortcuts import render
from myapp.models import Contact
def listing(request):
contact_list = Contact.objects.all()
paginator = Paginator(contact_list, 25) # Show 25 contacts per page.
page_number = request.GET.get("page")
page_obj = paginator.get_page(page_number)
return render(request, "list.html", {"page_obj": page_obj})
page-range
๋ฅผ ์ ์ฉํ๊ฒ ๋๋ค๋ฉด ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์ด๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ์ด์ง๊ฐ ํ์๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ํ์ด์ง ๋จ์๋ก ๋ฆฌํดํ๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ํ
ํ๋ฆฟ์์ ํธ์ถํ ์ ์๋ค.from django.http import HttpRequest, HttpResponse
from django.shortcuts import render, HttpResponseRedirect, redirect
from django.views.generic import TemplateView, CreateView, UpdateView, DeleteView, ListView, DetailView, FormView
from .models import Task, ChecklistItem
from django.utils import timezone
from django.core.paginator import Paginator
from django.urls import reverse_lazy
class TaskListView(TemplateView):
template_name = 'pages/task_list.html'
def get_context_data(self, **kwargs):
# tasks โ QuerySet(๋ฆฌ์คํธ ํํX)
tasks = Task.objects.filter(due__gte=timezone.now()).order_by('-due').all()
paginator = Paginator(tasks, 4)
page_number = self.request.GET.get('page', 1)
paging = paginator.get_page(page_number)
return {
'paging' : paging,
}
<div class="row mt-4">
<nav class="col-12">
<ul class="pagination justify-content-center">
{% if paging.has_previous %}
<li class="page-item">
<a class="page-link" href="?page={{paging.previous_page_number}}">์ด์ </a>
</li>
{% endif %}
<!-- Paginator.page_range A 1-based range iterator of page numbers, e.g. yielding [1, 2, 3, 4].-->
{% for page in paging|slice_visible_pages %}
{% if paging.number == page %}
<li class="page-item active">
{% else %}
<li class="page-item"></li>
{% endif %}
<a class="page-link" href="?page={{page}}">{{page}}</a>
</li>
{% endfor %}
{% if paging.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{paging.next_page_number}}">๋ค์</a>
</li>
{% endif %}
</ul>
</nav>
</div>
โ . templatetags ํด๋ ์์ฑ(์ด ๋, ์ผ๋ฐ ํด๋๊ฐ ์๋๋ผ Python Packages๋ก ์์ฑ)
โก. templatetags ํ์์ pagination_tags.py ํ์ผ ์์ฑ
from django import template
from django.core.paginator import Page
register = template.Library()
@register.filter(name="slice_visible_pages")
def slice_visible_pages(paging: Page):
min_page = int((paging.number - 1) / 10) * 10 + 1
# ์์๊ฐ ๋์ฌ ์ ์์ผ๋ฏ๋ก ํ์ด์ง์ ์์๊ฐ์ ๋ฌด์กฐ๊ฑด 1๋ก ์ค์ ํ๊ธฐ ์ํจ
min_page = max(min_page, 1)
max_page = min(min_page + 9, paging.paginator.num_pages)
return range(min_page, max_page+1)
์ฐธ๊ณ ์๋ฃ - Django Custom Template tags and filters
from django import template
from django.template.defaultfilters import stringfilter
register = template.Library()
@register.filter(name="cut")
def cut(value, arg):
return value.replace(arg, "")
{% load %}
๋ฌธ์ ์ด์ฉํด์ ๋ก๋ํ ํ or
์ ์ด์ฉํด์ ์๋์ ๊ฐ์ด ์์ฑํด์ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.{% load pagination_tags %}
...
{% for page in paging|slice_visible_pages %}