В одном из проектов столкнулся с задачей которая заключалась в следующем.
Нужно было сделать страницу поиска на благовом сайте работающем на Django. Проблема заключалась в следующем. В Django есть модуль Paginator стандартной пагинации, но в документации описана его работа при POST запросах. А поиск это GET запрос и ко всему сайт большой и результатом поиска может быть и пятьдесят постов. Решение которое я нашёл описано ниже.
В views.py стандартно импортируем Paginator и делаем так как описывает документация.
Вся магия начинается в шаблоне HTML нам всего лишь нужно добавить одну строчку кода
А вот собственно и шаблон пагинации HTML
Вуаля и пагинация работает как при POST запросах так и GET.
Нужно было сделать страницу поиска на благовом сайте работающем на Django. Проблема заключалась в следующем. В Django есть модуль Paginator стандартной пагинации, но в документации описана его работа при POST запросах. А поиск это GET запрос и ко всему сайт большой и результатом поиска может быть и пятьдесят постов. Решение которое я нашёл описано ниже.
В views.py стандартно импортируем Paginator и делаем так как описывает документация.
from django.db.models import Q
from django.core.paginator import Paginator
from main.models import Article
def search(request):
context = {}
if request.method == 'GET':
q = SearchForm(request.GET)
if q.is_valid():
q = q.cleaned_data['q']
articles = Article.objects.active() \
.filter(Q(description__icontains=q)) \
.order_by('-publication_date')
paginator = Paginator(articles, 24)
page = request.GET.get('page', 1)
context['articles'] = paginator.get_page(page)
return render(request, 'main/search.html', context=context)
Вся магия начинается в шаблоне HTML нам всего лишь нужно добавить одну строчку кода
{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}
А вот собственно и шаблон пагинации HTML
{% load i18n %}
<ul>
{% if articles.has_previous %}
<li>
<a class="Next" href="?page={{ articles.previous_page_number }}{% if request.GET.q %}&q=
{{request.GET.q }}{% endif %}">{% trans 'Предыдущая' %}
</a>
</li>
{% endif %}
{% for n in articles.paginator.page_range %}
{% if n > articles.number|add:-4 and n < articles.number|add:4 %}
<li class='{% if n == articles.number %}active{% else %}no-active{% endif %}'>
<a href='?page={{ n }}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}'>{{ n }}</a>
</li>
{% endif %}
{% endfor %}
{% if articles.has_next %}
<li>
<a class="Next" href="?page=
{{ articles.next_page_number }}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">
{% trans 'Следующая' %}</a>
</li>
{% endif %}
</ul>
Вуаля и пагинация работает как при POST запросах так и GET.