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 ו-has_previous הם True כשיש עמוד אחרי העמוד הנוכחי או לפניו, בהתאמה, ו-next_page_number ו-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 משרות בכל עמוד.

  1. ב־jobs/views.py, הגדירו את JobListView כך שיציג 5 משרות בכל עמוד.
  2. ב־job_list.html, מתחת לרשימה, הוסיפו <nav class="pages"> עם קישורים שהכיתוב שלהם יהיה בדיוק Previous ו־Next, וביניהם Page 1 of 3 מתוך page_obj. הציגו כל קישור רק כאשר העמוד המתאים קיים, אחרת העמוד יקרוס.

פתחו את /jobs/ ולחצו על Next: תראו Page 2 of 3.

נסו בעצמכם

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 אונליין