Stronicowanie
Część sekcji Widoki oparte na klasach ścieżki Django w Coddy. Lekcja 8 z 18.
Strona z ofertami pracy wyświetla wszystkie oferty naraz, a tysiąc się na niej nie zmieści. Stronicowanie dzieli listę na strony z linkami między nimi. ListView dzieli listę za pomocą jednego atrybutu, paginate_by, który określa liczbę wierszy na stronie.
Przy ustawieniu paginate_by = 20 dla listy przepisów adres /recipes/ wyświetla pierwsze 20, /recipes/?page=2 — kolejne 20, a próba przejścia na stronę poza końcem listy zwraca błąd 404. Lista w szablonie zawiera tylko wiersze z bieżącej strony, a szablon otrzymuje też is_paginated i page_obj, czyli bieżącą stronę.
Linki musisz napisać samodzielnie. page_obj udostępnia number, paginator.num_pages, has_next, next_page_number, has_previous i previous_page_number:
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">More recipes</a>
{% endif %}Umieść warunek sprawdzający przed każdym linkiem: na ostatniej stronie next_page_number zgłasza błąd, który powoduje awarię strony.
Wyzwanie
ŁatwyWyświetlaj oferty pracy po 5 na stronie:
- W
JobListView— 5 wierszy na stronę. - W
job_list.html, pod listą, umieść<nav class="pages">z linkiemPrevious, tekstemPage 1 of 3(rzeczywiste liczby) i linkiemNext. Każdy link wyświetla się tylko wtedy, gdy istnieje odpowiadająca mu strona.
Naciśnij Run, otwórz /jobs/ i naciśnij Next.
Spróbuj swoich sił
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
Wszystkie lekcje w sekcji Widoki oparte na klasach
2Generyczne widoki wyświetlania
ListViewDetailViewPoćwicz samodzielnie: Edytor online Django