Menu
CoddyTech

עימוד

חלק מהיחידה תצוגות מבוססות מחלקות במסלול ה-Django של Coddy. שיעור 8 מתוך 18.

דף המשרות מציג את כל המשרות בבת אחת, ואלף משרות לא היו נכנסות בו. חלוקה לעמודים מפצלת רשימה לעמודים, עם קישורים ביניהם. ListView מבצע את הפיצול באמצעות מאפיין אחד, paginate_by, שמציין את מספר השורות בכל עמוד.

כאשר מגדירים paginate_by = 20 ברשימת מתכונים, /recipes/ מציג את 20 המתכונים הראשונים, /recipes/?page=2 מציג את 20 המתכונים הבאים, ועמוד שמעבר לסוף הרשימה מחזיר שגיאת 404. הרשימה שבתבנית מכילה רק את השורות של העמוד הנוכחי, והתבנית מקבלת גם את is_paginated ואת page_obj, שמייצג את העמוד הנוכחי.

את הקישורים עליך לכתוב בעצמך. page_obj מכיר את number, את paginator.num_pages, את has_next, את next_page_number, את has_previous ואת previous_page_number:

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

יש להשאיר בדיקה סביב כל קישור: בעמוד האחרון, next_page_number מעלה שגיאה שגורמת לקריסת העמוד.

challenge icon

אתגר

קל

הצג 5 משרות בכל עמוד:

  • ב־JobListView, 5 שורות בכל עמוד.
  • ב־job_list.html, מתחת לרשימה, <nav class="pages"> עם קישור Previous, הטקסט Page 1 of 3 (מספרים בפועל) וקישור Next. כל קישור מוצג רק כשהעמוד שלו קיים.

לחץ על Run, פתח את /jobs/ ולחץ על Next.

נסו בעצמכם

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

כל השיעורים ביחידה תצוגות מבוססות מחלקות

תרגלו בעצמכם: Django אונליין