繁体   English   中英

如何在列表视图中对已过滤的查询集进行分页

[英]How to paginate a filtered queryset in listview

我试图在我的列表视图页面上添加搜索栏。 它会在第一时间获得所有发布项目,并且如果将查询放入搜索框并提交,它将返回一个经过过滤的查询集。 它可以很好地显示,但只存在分页问题。 对于未过滤的查询集,下一页将获得接下来的两个帖子,而没有任何问题,但是对于过滤的查询集,我可以看到查询集已正确地反映为较少的页面,但是下一页使我获得了第二个未过滤的页面queryset不是过滤的queryset。 谁能给我一些关于我在这里做错什么的指示。 谢谢

我的模板如下所示:

{% block content %}
  .....
 <form action="" method="get">
            <input type="text" name='q'>
            <input type="submit" value="Search">
     </form>


    {% for post in object_list %}
    ....
    {% endfor %}


    {% if is_paginated %}
            <div class="pagination">
                <span class="page-links">
                    {% if page_obj.has_previous %}
                        <a href="?page={{ page_obj.previous_page_number }}"><<</a>
                    {% endif %}
                    <span class="page-current">
                        Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
                    </span>
                    {% if page_obj.has_next %}
                        <a href="?page={{ page_obj.next_page_number }}">>></a>
                    {% endif %}
                </span>
            </div>
{% endif %}

我有一个如下的列表视图。

class Postlist(ListView):
model=post    
paginate_by = 2
query_string = ''

def get_queryset(self):


    if ('q' in self.request.GET) and self.request.GET['q'].strip():
       query_string = self.request.GET['q']
       entry_query = get_query(query_string, ['title', 'body',]) ## call get_query() function
       queryset = post.objects.filter(entry_query).order_by('-created')

    else:
       queryset=post.objects.all().order_by('-created')

    return queryset

def get_context_data(self):
    context = super(ListView, self).get_context_data(**kwargs)
    context['q'] = query_string
    ## do sth here to pre-populate the input text box
    return context

让我关闭这个。 两个选项:使用隐藏字段保存用户搜索字词,并获取该字词以滤除每个请求的查询集; 或使用会话。 这是会话代码示例。 我可以想到的使用会话缓存的唯一缺点是它将整个查询集缓存在内存中,因此它将占用高流量网站的内存。 由于我将其用于个人网站,因此完全没有伤害。

查看文件

class Postlist(ListView):
model=post
paginate_by = 2

def get_queryset(self):
    query_string = ''
    if ('search' in self.request.GET) and self.request.GET['search'].strip():
       query_string = self.request.GET['search']
       entry_query = get_query(query_string, ['title', 'body',]) ## call get_query to clean search terms
       queryset = post.objects.filter(entry_query).order_by('-created')
       self.request.session['searchset']=queryset

    else:
       if self.request.session.get('searchset') and ('page' in self.request.GET):
           queryset=self.request.session['searchset']
       else:
           queryset=post.objects.all().order_by('-created')
           if self.request.session.get('searchset'):
             del self.request.session['searchset']
    return queryset

表格文件

from django import forms

SearchForm(forms.Form)类:search = forms.CharField(max_length = 30)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM