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.
Tantangan
MudahTampilkan lowongan kerja 5 per halaman.
- Di
jobs/views.py, atur agarJobListViewmenampilkan 5 lowongan kerja per halaman. - Di
job_list.html, tambahkan<nav class="pages">di bawah daftar, dengan tautan yang bertuliskan persisPreviousdanNext, sertaPage 1 of 3daripage_objdi 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
2Tampilan Generik untuk Menampilkan Data
ListViewDetailViewLatihan sendiri: Playground Django