페이지네이션
Coddy Django 여정의 클래스 기반 뷰 섹션에 포함된 레슨. 18개 중 8번째.
작업 페이지에는 모든 작업이 한꺼번에 표시되므로, 천 개의 작업은 모두 담을 수 없습니다. 페이지네이션은 목록을 페이지로 나누고 페이지 사이에 링크를 제공합니다. ListView는 페이지당 행 수를 지정하는 paginate_by 속성 하나로 목록을 나눕니다.
레시피 목록에 paginate_by = 20을 설정하면 /recipes/에는 처음 20개가 표시되고, /recipes/?page=2에는 다음 20개가 표시됩니다. 마지막 페이지를 넘어선 페이지를 요청하면 404 응답을 반환합니다. 템플릿의 목록에는 현재 페이지의 행만 들어 있으며, 템플릿에는 현재 페이지를 나타내는 is_paginated와 page_obj도 전달됩니다.
링크는 직접 작성해야 합니다. page_obj에는 number, paginator.num_pages, has_next, next_page_number, has_previous, previous_page_number가 있습니다.
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">More recipes</a>
{% endif %}모든 링크를 조건문으로 감싸야 합니다. 마지막 페이지에서는 next_page_number가 오류를 발생시켜 페이지가 중단됩니다.
챌린지
쉬움페이지당 채용 공고를 5개씩 표시합니다.
JobListView에서 페이지당 5개 행을 표시합니다.job_list.html에서 목록 아래에<nav class="pages">를 추가하고,Previous링크와 실제 숫자로 표시되는Page 1 of 3텍스트,Next링크를 넣습니다. 각 링크는 해당 페이지가 있을 때만 표시됩니다.
Run을 누르고 /jobs/를 연 다음 Next를 누릅니다.
직접 해보기
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 플레이그라운드