עימוד
חלק מהיחידה תצוגות מבוססות מחלקות במסלול ה-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 מעלה שגיאה שגורמת לקריסת העמוד.
אתגר
קלהצג 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 אונליין