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 dengan tautan di antaranya. ListView membagi list menggunakan 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 menghasilkan respons 404. List dalam template hanya memuat baris di halaman ini, dan template juga mendapatkan is_paginated serta page_obj, yaitu halaman saat ini.

Kamu yang menulis tautannya. page_obj mengetahui number, paginator.num_pages, has_next, next_page_number, has_previous, dan previous_page_number:

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

Sertakan pemeriksaan di sekitar setiap tautan: di halaman terakhir, next_page_number menimbulkan error yang membuat halaman mengalami crash.

challenge icon

Tantangan

Mudah

Tampilkan lowongan 5 per halaman:

  • Di JobListView, 5 baris per halaman.
  • Di job_list.html, di bawah daftar, tampilkan <nav class="pages"> dengan tautan Previous, teks Page 1 of 3 (angka sebenarnya), dan tautan Next. Setiap tautan hanya ditampilkan jika halamannya tersedia.

Tekan Jalankan, buka /jobs/, lalu tekan Next.

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