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; bin iş ekrana sığmaz. Sayfalama, bir listeyi aralarında bağlantılar bulunan sayfalara böler. ListView, bölme işlemini tek bir öznitelikle yapar: sayfa başına satır sayısını belirleyen paginate_by.

Bir tarif listesinde paginate_by = 20 kullanıldığında, /recipes/ ilk 20 tarifi, /recipes/?page=2 sonraki 20 tarifi gösterir; son sayfayı aşan bir sayfa isteği ise 404 yanıtı verir. Şablonun listesi yalnızca o sayfanın satırlarını içerir ve şablona ayrıca mevcut sayfa olan is_paginated ile page_obj da aktarılır.

Bağlantıları yazmak sana kalmış. page_obj, number, paginator.num_pages, has_next, next_page_number, has_previous ve previous_page_number değerlerini bilir:

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

Her bağlantının etrafındaki testi koru: son sayfada next_page_number bir hata oluşturarak sayfanın çökmesine neden olur.

challenge icon

Görev

Kolay

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

  • JobListView içinde, sayfa başına 5 satır.
  • job_list.html içinde, listenin altında <nav class="pages">, bir Previous bağlantısı, Page 1 of 3 metni (gerçek sayılarla) ve bir Next bağlantısı bulunsun. Her bağlantı yalnızca ilgili sayfa varsa gösterilsin.

Run'a basın, /jobs/ sayfasını açın ve Next'e basın.

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