【问题标题】:Paginator resets query as I change page当我更改页面时,Paginator 重置查询
【发布时间】:2020-02-19 23:52:36
【问题描述】:

我正在用 Django 开发一个应用程序。

我有一个模板,其中显示了我的模型中的数据。

模板有一个搜索栏和一个分页器。

问题是,当我运行查询时(假设我搜索“家”这个词),
它显示了第一页的过滤结果,但是当我单击分页器进入下一页时,
查询被重置,我得到未过滤数据(整个数据)的第 2 页。

那么,如何结合搜索栏和分页器对结果的过滤呢?

这是我的搜索条形码:

<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})

【问题讨论】:

    标签: django django-templates django-views filtering paginator


    【解决方案1】:

    已解决:

    从views.py我向我的模板传递了一个变量query,其中包含我在搜索栏中单击“搜索”时提交的术语的request.GET.get(它们在输入中保存为q我的搜索栏)。
    在我的views.py中,这个变量也是在我得到输入之前定义的,所以当页面第一次加载时,它的值是无效的。

    为了解决这个问题,我实现了以下逻辑:

    在分页器中,

    • 如果我的搜索栏未提交任何查询,
      我将分页器呈现为 我在问题中提到的那个,

    • 否则,
      我将 url 连接起来以同时具有搜索栏 quesryset 变量和分页器页面查询集变量。

    看这里:

    在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>
    

    搜索条码保持不变。

    【讨论】:

      猜你喜欢
      • 2020-07-14
      • 2022-11-10
      • 2019-12-25
      • 2022-09-29
      • 2022-01-24
      • 2021-12-06
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多