Menu
CoddyTech

페이지네이션

Coddy Django 여정의 클래스 기반 뷰 섹션에 포함된 레슨. 18개 중 8번째.

작업 페이지에는 모든 작업이 한꺼번에 표시되므로, 작업이 천 개라면 모두 담을 수 없습니다. 페이지 나누기는 목록을 여러 페이지로 나누고 페이지 사이에 링크를 둡니다. ListView는 paginate_by라는 속성 하나로 페이지당 행 수를 지정해 목록을 나눕니다.

레시피 목록에 paginate_by = 20을 설정하면 /recipes/에는 처음 20개가 표시되고, /recipes/?page=2에는 다음 20개가 표시됩니다. 마지막 페이지를 넘어가는 페이지나 숫자가 아닌 페이지를 요청하면 404 응답을 받습니다. 템플릿의 목록에는 현재 페이지의 행만 담기며, 템플릿에는 현재 페이지인 page_obj와 is_paginated도 전달됩니다.

링크는 page_obj를 사용해 직접 작성해야 합니다. number는 현재 페이지이고 paginator.num_pages는 전체 페이지 수입니다. has_next와 has_previous는 각각 현재 페이지 다음이나 이전에 페이지가 있으면 True이며, next_page_number와 previous_page_number는 해당 페이지 번호를 알려줍니다.

{% if page_obj.has_next %}
  <a href="?page={{ page_obj.next_page_number }}">More recipes</a>
{% endif %}

각 링크를 검사하는 조건을 반드시 유지하세요. 마지막 페이지에서 next_page_number를 호출하면 오류가 발생해 페이지가 중단됩니다.

challenge icon

챌린지

쉬움

페이지당 채용 공고를 5개 표시하세요.

  1. jobs/views.py에서 JobListView가 페이지당 채용 공고를 5개 표시하도록 하세요.
  2. job_list.html에서 목록 아래에 <nav class="pages">를 추가하고, 링크에는 정확히 Previous와 Next라고 표시하며, 그 사이에는 page_obj를 사용해 Page 1 of 3이라고 표시하세요. 페이지가 존재하는 경우에만 각 링크를 표시하세요. 그렇지 않으면 페이지에서 오류가 발생합니다.

/jobs/를 열고 Next를 누르면 Page 2 of 3이 표시됩니다.

직접 해보기

from django.views.generic import DetailView, ListView, TemplateView

from .models import Job


class HomeView(TemplateView):
    template_name = "jobs/home.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["count"] = Job.objects.count()
        context["latest"] = Job.objects.order_by("-posted").first()
        return context


class AboutView(TemplateView):
    template_name = "jobs/about.html"


class JobListView(ListView):
    model = Job
    context_object_name = "jobs"
    ordering = ["-posted"]

    def get_queryset(self):
        jobs = super().get_queryset()
        city = self.request.GET.get("city")
        if city:
            jobs = jobs.filter(city=city)
        return jobs


class JobDetailView(DetailView):
    model = Job

클래스 기반 뷰의 모든 레슨

직접 연습해 보세요: Django 플레이그라운드