Первая / Предыдущая и Следующая / Последняя ссылки для постраничного запроса Django - PullRequest
0 голосов
/ 23 сентября 2019

Я создал форму фильтра, используя Django, которая возвращает список совпадений с нумерацией страниц.

Когда я первоначально запускаю фильтр, я получаю правильное количество отображаемых страниц.Однако, когда я нажимаю на другой номер страницы, страница возвращается к соответствующему номеру страницы для нефильтрованных результатов.Например, я фильтрую результаты по «Ошибка» и получаю все разбитые на страницы результаты для заявок с типом «Ошибка».На странице отображаются ссылки на разные страницы (1, 2, 3 и т. Д.), А также кнопки «Следующая» и «Последняя».Однако, если я нажму «3», результаты вернутся к нефильтрованным результатам, я получу результаты для страницы 3 нефильтрованных результатов вместо страницы 3 отфильтрованных результатов и общее количество страниц для нефильтрованных результатов.показать в ссылках на нумерацию страниц.

Кто-нибудь может мне помочь понять, как решить проблему и сохранить отфильтрованные результаты при навигации по нумерации страниц?

all_tickets.html:

// filter form code //

// Displayed results (unfiltered results displayed when page is first loaded) //

<!-- Pagination - only visible if there are multiple pages -->
{% if tickets.has_other_pages %}
    <ul class="pagination center-align">
        <!-- Previous/First button - only visible if previous page available -->
        {% if tickets.has_previous %}
            <!-- First page button -->
            <li>
                <a href="?page=1">
                    <i class="fas fa-angle-double-left" aria-hidden="true"></i>
                </a>
            </li>
            <!-- Previous page button -->
            <li>
                <a href="?page={{ tickets.previous_page_number }}">
                    <i class="fas fa-angle-left" aria-hidden="true"></i>
                </a>
            </li>
        {% endif %}

        <!-- Show link to current page and only few other surrounding pages, not all -->
        {% for num in tickets.paginator.page_range %}
            <!-- Show the current page number but disable it -->
            {% if tickets.number == num %}
                <li class="disabled">
                    <a>
                        {{ num }}
                    </a>
                </li>
            <!-- Show the 4 surrounding (2 next and 2 previous) pages -->
            {% elif num > tickets.number|add:'-3' and num < tickets.number|add:'3' %}
                <li>
                    <a href="?page={{ num }}">
                        {{ num }}
                    </a>
                </li>
            {% endif %}
        {% endfor %}

        <!-- Next/Last button - only visible if previous page available -->
        {% if tickets.has_next %}
            <!-- Next page button -->
            <li>
                <a href="?page={{ tickets.next_page_number }}">
                    <i class="fas fa-angle-right" aria-hidden="true"></i>
                </a>
            </li>
            <!-- Last page button -->
            <li>
                <a href="?page={{ tickets.paginator.num_pages }}">
                    <i class="fas fa-angle-double-right" aria-hidden="true"></i>
                </a>
            </li>
        {% endif %}

    </ul>
{% endif %}

представление поиска в файле views.py:

def view_all_tickets(request):
    '''
    View all tickets
    Allows users to filter tickets based on type or status
    '''
    tickets = Ticket.objects.all()
    page = request.GET.get('page', 1)
    ticket_type_dropdown = TicketType.objects.all()
    ticket_status_dropdown = TicketStatus.objects.all()

    # Query parameters
    ticket_type = request.GET.get("ticket_type")
    ticket_status = request.GET.get("ticket_status")

    # Filter by query parameters
    if ticket_type:
        tickets = tickets.filter(ticket_type__id=ticket_type)
    else:
        tickets

    if ticket_status:
        tickets = tickets.filter(ticket_status__id=ticket_status)
    else:
        tickets

    # Pagination
    paginator = Paginator(tickets, 1)

    try:
        tickets = paginator.page(page)
    except PageNotAnInteger:
        tickets = paginator.page(1)
    except:
        tickets = paginator.page(paginator.num_pages)

    args = {
        "tickets": tickets,
        "ticket_type_dropdown": ticket_type_dropdown,
        "ticket_status_dropdown": ticket_status_dropdown,
    }

    return render(request, "all_tickets.html", args)

1 Ответ

0 голосов
/ 23 сентября 2019

Вам необходимо включить все параметры запроса в каждую ссылку.Поэтому вы должны передать их обратно в шаблон и добавить их в параметры:

args = {
    "tickets": tickets,
    "ticket_type_dropdown": ticket_type_dropdown,
    "ticket_status_dropdown": ticket_status_dropdown,
    "ticket_type": ticket_type,
    "ticket_status": ticket_status,
}

return render(request, "all_tickets.html", args)

...

<a href="?page={{ tickets.previous_page_number }}&ticket_type={{ ticket_type }}&ticket_status={{ ticket_status }}">
etc.

Чтобы упростить это, вы можете определить фильтр шаблона, который выводитсуществующая ссылка автоматически и позволяет добавлять только переменную номера страницы, некоторые из сторонних библиотек нумерации страниц, вероятно, включают это.

...