Pull to refresh

Django пагинация на странице поиска

В одном из проектов столкнулся с задачей которая заключалась в следующем.

Нужно было сделать страницу поиска на благовом сайте работающем на 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.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.