Menu
CoddyTech

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.

challenge icon

Görev

Kolay

İş ilanlarını sayfa başına 5 tane gösterin.

  1. jobs/views.py dosyasında, JobListView sınıfının sayfa başına 5 iş ilanı göstermesini sağlayın.
  2. job_list.html dosyasında, listenin altına, metinleri tam olarak <nav class="pages"> olan bağlantılar ekleyin: Previous ve Next; aralarına da page_obj üzerinden Page 1 of 3 ekleyin. 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