עימוד
חלק מהיחידה תצוגות מבוססות מחלקות במסלול ה-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 מעלה שגיאה שגורמת לקריסת הדף.
אתגר
קלהציגו 5 משרות בכל עמוד.
- ב־
jobs/views.py, הגדירו אתJobListViewכך שיציג 5 משרות בכל עמוד. - ב־
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 אונליין