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. Paginacja dzieli listę na strony i umieszcza między nimi odnośniki. ListView dzieli listę za pomocą jednego atrybutu, paginate_by, określającego liczbę wierszy na stronę.
Przy paginate_by = 20 na liście przepisów /recipes/ wyświetla pierwsze 20, /recipes/?page=2 następne 20, a strona wykraczająca poza koniec listy lub niebędąca liczbą zwraca odpowiedź 404. Lista w szablonie zawiera tylko wiersze z bieżącej strony, a szablon otrzymuje też is_paginated i page_obj, czyli bieżącą stronę.
Odnośniki tworzysz samodzielnie, korzystając z page_obj: number oznacza bieżącą stronę, a paginator.num_pages — liczbę stron. has_next i has_previous mają wartość True, gdy istnieje strona odpowiednio po tej stronie lub przed nią, a next_page_number i previous_page_number podają jej numer:
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">More recipes</a>
{% endif %}Umieść warunek przy każdym odnośniku: na ostatniej stronie next_page_number zgłasza błąd, który powoduje awarię strony.
Wyzwanie
ŁatwyWyświetlaj oferty pracy po 5 na stronę.
- W pliku
jobs/views.pyustaw wJobListViewwyświetlanie 5 ofert pracy na stronę. - W pliku
job_list.html, poniżej listy, dodaj<nav class="pages">z linkami o dokładnych nazwachPreviousiNext, a między nimi tekstPage 1 of 3oparty napage_obj. Wyświetlaj każdy link tylko wtedy, gdy istnieje jego strona, w przeciwnym razie strona ulegnie awarii.
Otwórz /jobs/ i naciśnij Next: zobaczysz Page 2 of 3.
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