Paginator сбрасывает запрос при изменении страницы - PullRequest
0 голосов
/ 23 октября 2019

Я разрабатываю приложение в Django.

У меня есть шаблон, в котором отображаются данные из моей модели.

Шаблон имеет панель поиска, а также paginator.

Проблема в том, что когда я запускаю запрос (скажем, я ищу слово "home"),
показывает отфильтрованные результаты для первой страницы, но когда я нажимаю на свой пагинатор, чтобы перейти к следующемустраница,
запрос сбрасывается, и я получаю страницу 2 нефильтрованных данных (полные данные).

Итак, как я могу объединить фильтрацию результатов по панели поиска и paginator?

Вот мой штрих-код для поиска:

<form method="GET" action="{% url 'glossario' %}">

            <input id="testo_slot_ricerca_semplice" type="text" placeholder="Ricerca terminologia..." name="q" value="{{request.GET.q}}">  


            <!-- #cerca -->
            <button id="search_button" type="submit"><i class="fa fa-search"></i></button>

            <!-- cancella query -->
            <button id="cancel_search_button" type="submit" onclick="Delete_simple_search()"><i class="fa fa-trash"></i></button>              


          </form>

Вот мой код для разбивки на страницы:

<nav aria-label="...">
            <ul class="pagination">

                {% if all_entries.has_previous %}

                <li class="page-item">
                    <a class="page-link" href="?page=1">&laquo; first</a> 
                </li>

                <li class="page-item">
                    <a class="page-link" href="?page={{ all_entries.previous_page_number }}">{{ all_entries.previous_page_number }}</a>
                </li>

                {% else %}

                <li class="page-item disabled">
                    <a class="page-link" href="#" class="page-item disabled">&laquo; first</a>  
                </li> 

                <!-- <li class="page-item disabled"></li>
                    <a class="page-link" href="#" class="page-item disabled">previous</a>
                </li> -->

                {% endif %}



                <li class="page-item active">
                <a class="page-link" href="#">{{ all_entries.number }}<span class="sr-only">(current)</span></a>
                </li>



                {% if all_entries.has_next %}

                <li class="page-item">
                    <a class="page-link" href="?page={{ all_entries.next_page_number }}">{{ all_entries.next_page_number }}</a>
                </li>

                <li class="page-item">
                    <a class="page-link" href="?page={{ all_entries.paginator.num_pages }}">Last [ {{ all_entries.paginator.num_pages }} ] &raquo;</a> 
                </li>

                {% else %}

                <!-- <li class="page-item disabled"></li>
                    <a class="page-link" href="#" class="page-item disabled">next</a>
                </li> -->

                <li class="page-item disabled">
                   <a class="page-link" href="#" class="page-item disabled">Last [ {{ all_entries.paginator.num_pages }} ] &raquo;</a>  
                </li> 

                {% endif %}

            </ul>
        </nav>

А вот моя функция в views.py при заполнении шаблона:

def glossario(request):

    query = request.GET.get('q') 

    template = "glossario.html" 

    all_entries = glossary_entry.objects.all() 


    if query:

        query = request.GET.get('q') 
        selected_entries = glossary_entry.objects.filter(Q(Acronimo__icontains=query)|Q(Ambito_riferimento__icontains=query)|Q(Autore_definizione__icontains=query))


        # Pagination        
        paginator = Paginator(selected_entries, 10) # Show 25 contacts per page
        page = request.GET.get('page')
        selected_entries = paginator.get_page(page)


        return render(request, template, {'all_entries':selected_entries})

    # se non è stata fatta nessuna query
    else:

        # Pagination
        paginator = Paginator(all_entries, 10) 
        page = request.GET.get('page')
        all_entries = paginator.get_page(page)

        return render(request, template, {'all_entries':all_entries})

1 Ответ

0 голосов
/ 24 октября 2019

решено:

из views.py Я передаю своему шаблону переменную query, содержащую request.GET.get терминов, представленных после нажатия кнопки «поиск» в строке поиска (они сохраняютсякак q во входных данных моей панели поиска).

В моем views.py эта переменная также определяется до того, как я получу ввод, поэтому, когда страница загружается в первый раз, ее значение равно void.

Затем в paginator,

, если моя панель поиска не отправила запрос, я отображаю paginator как тот, который я показал в вопросе,

в противном случае, я объединяю URLчтобы иметь как переменную набора запросов панели поиска, так и переменную набора страниц страницы.

См. здесь:

в views.py:

def glossario(request):

    query = request.GET.get('q') 

    template = "glossario.html" 

    all_entries = glossary_entry.objects.all() 

    # if query has been submitted to search bar
    if query:

        query = request.GET.get('q') database
        selected_entries = glossary_entry.objects.filter(Q(Acronimo__icontains=query)|Q(Ambito_riferimento__icontains=query)|Q(Autore_definizione__icontains=query)|Q(Autore_documento_fonte__icontains=query)|Q(Data_inserimento_entry__icontains=query)|Q(Definizione__icontains=query)|Q(Host_documento_fonte__icontains=query)|Q(Id_statico_entry__icontains=query)|Q(Lemma__icontains=query)|Q(Posizione_definizione__icontains=query)|Q(Titolo_documento_fonte__icontains=query)|Q(Url_definizione__icontains=query)|Q(Url_documento_fonte__icontains=query))


        # Pagination        
        paginator = Paginator(selected_entries, 10) # Show 25 contacts per page
        page = request.GET.get('page')
        selected_entries = paginator.get_page(page)


        return render(request, template, {'all_entries':selected_entries, 'query':query})

    # if query has NOT been submitted to search bar
    else:

        # Pagination
        paginator = Paginator(all_entries, 10) # Show 25 contacts per page
        page = request.GET.get('page')
        all_entries = paginator.get_page(page)

        return render(request, template, {'all_entries':all_entries, 'query':query})

в шаблоне:

    <nav aria-label="...">
        <ul class="pagination">

        <!-- Se la q ha ricevuto un input = la search bar ha inserito input -->    
        {% if query %}

            {% if all_entries.has_previous %}

                <li class="page-item">
                    <a class="page-link" href="?q={{ query }}&page=1">&laquo; Prima pagina</a> 
                </li>

                <li class="page-item">
                    <a class="page-link" href="?q={{ query }}&page={{ all_entries.previous_page_number }}">{{ all_entries.previous_page_number }}</a>
                </li>

            {% else %}

                <li class="page-item disabled">
                    <a class="page-link" href="#" class="page-item disabled">&laquo; Prima pagina</a>  
                </li> 

            <!-- <li class="page-item disabled"></li>
                <a class="page-link" href="#" class="page-item disabled">previous</a>
            </li> -->

            {% endif %}


            <li class="page-item active">
            <a class="page-link" href="#">{{ all_entries.number }}<span class="sr-only">(current)</span></a>
            </li>


            {% if all_entries.has_next %}

                <li class="page-item">
                    <a class="page-link" href="?q={{ query }}&page={{ all_entries.next_page_number }}">{{ all_entries.next_page_number }}</a>
                </li>

                <li class="page-item">
                    <a class="page-link" href="?q={{ query }}&page={{ all_entries.paginator.num_pages }}">Ultima pagina [ {{ all_entries.paginator.num_pages }} ] &raquo;</a> 
                </li>

            {% else %}

                <!-- <li class="page-item disabled"></li>
                    <a class="page-link" href="#" class="page-item disabled">next</a>
                </li> -->

                <li class="page-item disabled">
                <a class="page-link" href="#" class="page-item disabled">Ultima pagina [ {{ all_entries.paginator.num_pages }} ] &raquo;</a>  
                </li> 

            {% endif %}

    <!-- Se la q è vuota = la search bar non ha inserito input -->
    {% else %}


        {% if all_entries.has_previous %}

            <li class="page-item">
                <a class="page-link" href="?page=1">&laquo; Prima pagina</a> 
            </li>

            <li class="page-item">
                <a class="page-link" href="?page={{ all_entries.previous_page_number }}">{{ all_entries.previous_page_number }}</a>
            </li>

        {% else %}

            <li class="page-item disabled">
                <a class="page-link" href="#" class="page-item disabled">&laquo; Prima pagina</a>  
            </li> 

        <!-- <li class="page-item disabled"></li>
            <a class="page-link" href="#" class="page-item disabled">previous</a>
        </li> -->

        {% endif %}


        <li class="page-item active">
        <a class="page-link" href="#">{{ all_entries.number }}<span class="sr-only">(current)</span></a>
        </li>


        {% if all_entries.has_next %}

            <li class="page-item">
                <a class="page-link" href="?page={{ all_entries.next_page_number }}">{{ all_entries.next_page_number }}</a>
            </li>

            <li class="page-item">
                <a class="page-link" href="?page={{ all_entries.paginator.num_pages }}">Ultima pagina [ {{ all_entries.paginator.num_pages }} ] &raquo;</a> 
            </li>

        {% else %}

            <!-- <li class="page-item disabled"></li>
                <a class="page-link" href="#" class="page-item disabled">next</a>
            </li> -->

            <li class="page-item disabled">
            <a class="page-link" href="#" class="page-item disabled">Ultima pagina [ {{ all_entries.paginator.num_pages }} ] &raquo;</a>  
            </li> 

        {% endif %}


    {% endif %}

        </ul>
    </nav>

Штрих-код поиска остался нетронутым.

...