Menu
CoddyTech

Paginasi

Termasuk bagian View Berbasis Class dalam perjalanan Django di Coddy. Pelajaran 8 dari 18.

Halaman pekerjaan menampilkan semua pekerjaan sekaligus, dan seribu pekerjaan tidak akan muat. Paginasi membagi list menjadi beberapa halaman yang saling terhubung dengan tautan. ListView membaginya dengan satu atribut, paginate_by, yaitu jumlah baris per halaman.

Dengan paginate_by = 20 pada list resep, /recipes/ menampilkan 20 resep pertama, /recipes/?page=2 menampilkan 20 resep berikutnya, dan halaman setelah halaman terakhir, atau halaman dengan nomor yang bukan angka, menghasilkan respons 404. list dalam templat hanya memuat baris untuk halaman ini, dan templat juga mendapatkan is_paginated dan page_obj, yaitu halaman saat ini.

Kamu perlu menulis sendiri tautannya, menggunakan page_obj: number adalah nomor halaman ini dan paginator.num_pages adalah jumlah halaman. has_next dan has_previous bernilai True jika ada halaman setelah atau sebelum halaman ini, sedangkan next_page_number dan previous_page_number memberikan nomor halamannya:

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

Selalu sertakan kondisi untuk setiap tautan: di halaman terakhir, next_page_number memunculkan error yang membuat halaman mogok.

challenge icon

Tantangan

Mudah

Tampilkan lowongan kerja 5 per halaman.

  1. Di jobs/views.py, atur agar JobListView menampilkan 5 lowongan kerja per halaman.
  2. Di job_list.html, tambahkan <nav class="pages"> di bawah daftar, dengan tautan yang bertuliskan persis Previous dan Next, serta Page 1 of 3 dari page_obj di antaranya. Tampilkan setiap tautan hanya jika halamannya ada, atau halaman akan mengalami error.

Buka /jobs/ lalu tekan Next: kamu akan melihat Page 2 of 3.

Coba sendiri

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

Semua pelajaran di View Berbasis Class

Latihan sendiri: Playground Django