How to do it...

To add pagination to the list view of the ideas, follow these steps:

  1. Import the necessary pagination classes from Django into the views.py file. We will add pagination management to the idea_list view just after filtering. Also, we will slightly modify the context dictionary by assigning page to the object_list key:
# myproject/apps/ideas/views.py
from django.shortcuts import render, redirect, get_object_or_404
from django.conf import settings
from django.core.paginator import (EmptyPage, PageNotAnInteger, Paginator)

from .forms import IdeaFilterForm
from .models import Idea, RATING_CHOICES


PAGE_SIZE = getattr(settings, "PAGE_SIZE", 24)


def idea_list(request):
qs = Idea.objects.order_by("title")
form = IdeaFilterForm(data=request.GET)

facets = {
"selected": {},
"categories": {
"authors": form.fields["author"].queryset,
"categories": form.fields["category"].queryset,
"ratings": RATING_CHOICES,
},
}

if form.is_valid():
filters = (
# query parameter, filter parameter
("author", "author"),
("category", "categories"),
("rating", "rating"),
)
qs = filter_facets(facets, qs, form, filters)

paginator = Paginator(qs, PAGE_SIZE)
page_number = request.GET.get("page")
try:
page = paginator.page(page_number)
except PageNotAnInteger:
# If page is not an integer, show first page.
page = paginator.page(1)
except EmptyPage:
# If page is out of range, show last existing page.
page = paginator.page(paginator.num_pages)

context = {
"form": form,
"facets": facets,
"object_list": page,
}
return render(request, "ideas/idea_list.html", context)
  1. Modify the idea_list.html template as follows:
{# ideas/idea_list.html #}
{% extends "base.html" %}
{% load i18n utility_tags %}

{% block sidebar %}
{% include "ideas/includes/filters.html" %}
{% endblock %}

{% block main %}
<h1>{% trans "Ideas" %}</h1>
{% if object_list %}
{% for idea in object_list %}
<a href="{{ idea.get_url_path }}" class="d-block my-3">
<div class="card">
<img src="{{ idea.picture_thumbnail.url }}"
alt="" />
<div class="card-body">
<p class="card-text">{{ idea.translated_title
}}</p>
</div>
</div>
</a>
{% endfor %}
{% include "misc/includes/pagination.html" %}
{% else %}
<p>{% trans "There are no ideas yet." %}</p>
{% endif %}
<a href="{% url 'ideas:add_idea' %}" class="btn btn-primary">
{% trans "Add idea" %}</a>
{% endblock %}
  1. Create the pagination widget template:
{# misc/includes/pagination.html #}
{% load i18n utility_tags %}
{% if object_list.has_other_pages %}
<nav aria-label="{% trans 'Page navigation' %}">

<ul class="pagination">
{% if object_list.has_previous %}
<li class="page-item"><a class="page-link" href="{%
modify_query page=object_list.previous_page_number %}">
{% trans "Previous" %}</a></li>
{% else %}
<li class="page-item disabled"><span class="page-
link"
>{% trans "Previous" %}</span></li>
{% endif %}

{% for page_number in object_list.paginator
.page_range %}
{% if page_number == object_list.number %}
<li class="page-item active">
<span class="page-link">{{ page_number }}
<span class="sr-only">{% trans
"(current)" %}</span>
</span>
</li>
{% else %}
<li class="page-item">
<a class="page-link" href="{% modify_query
page=page_number %}">
{{ page_number }}</a>
</li>
{% endif %}
{% endfor %}

{% if object_list.has_next %}
<li class="page-item"><a class="page-link" href="{%
modify_query page=object_list.next_page_number %}">
{% trans "Next" %}</a></li>
{% else %}
<li class="page-item disabled"><span class="page-
link"
>{% trans "Next" %}</span></li>
{% endif %}
</ul>
</nav>
{% endif %}
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.144.84.155