Sayfalama
Coddy'nin Django Journey'sinin Sınıf Tabanlı Görünümler bölümünün bir parçası. Ders 8 / 18.
İşler sayfası tüm işleri aynı anda gösterir ve bin tanesi sığmaz. Sayfalama, bir listeyi aralarında bağlantılar bulunan sayfalara böler. ListView bu bölme işlemini tek bir özellik olan, sayfa başına satır sayısını belirten paginate_by ile yapar.
Bir tarif listesinde paginate_by = 20 olduğunda, /recipes/ ilk 20 tarifi, /recipes/?page=2 sonraki 20 tarifi gösterir; sonrasındaki bir sayfa veya sayı olmayan bir değer 404 yanıtı verir. Şablonun listesi yalnızca bu sayfanın satırlarını içerir ve şablona ayrıca mevcut sayfa olan is_paginated ve page_obj da aktarılır.
Bağlantıları page_obj üzerinden kendin yazarsın: number bu sayfayı, paginator.num_pages ise sayfa sayısını belirtir. has_next ve has_previous, bu sayfadan sonra veya önce bir sayfa varsa True değerini alır; next_page_number ve previous_page_number ise sayfa numarasını verir:
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">More recipes</a>
{% endif %}Her bağlantının etrafındaki koşulu koru: son sayfada next_page_number bir hata vererek sayfanın çökmesine neden olur.
Görev
Kolayİş ilanlarını sayfa başına 5 tane gösterin.
jobs/views.pydosyasında,JobListViewsınıfının sayfa başına 5 iş ilanı göstermesini sağlayın.job_list.htmldosyasında, listenin altına, metinleri tam olarak<nav class="pages">olan bağlantılar ekleyin:PreviousveNext; aralarına dapage_objüzerindenPage 1 of 3ekleyin. Her bağlantıyı yalnızca ilgili sayfa varsa gösterin, yoksa sayfa hata verir.
/jobs/ sayfasını açıp Next’e basın: Page 2 of 3 görürsünüz.
Kendin dene
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
Sınıf Tabanlı Görünümler bölümündeki tüm dersler
Kendi başına pratik yap: Django playground