如何在listvi中对过滤后的queryset分页

2024-09-30 16:23:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在我的listview页面上添加搜索栏。它将第一次获取所有的post项,如果一个查询放入搜索框中并提交,它将返回一个经过筛选的queryset。它渲染得很好,但只有分页问题。对于未过滤的queryset,下一页将毫无问题地得到接下来的两篇文章,但是对于filtered queryset,我可以看到see less pages正确地反映了queryset,但是下一页得到的是非过滤queryset的第二页,而不是filtered 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 %}

我有一个类似下面的列表视图。在

^{pr2}$

Tags: divformobjnumberinputiftypepage
1条回答
网友
1楼 · 发布于 2024-09-30 16:23:40

让我把这个关上。有两个选项:使用隐藏字段保存用户搜索项,并使其过滤每个请求的queryset;或使用session。这是会话代码示例。我认为使用会话缓存的唯一缺点是它会在内存中缓存整个queryset,因此它会为高流量网站耗尽内存。因为我用它作为个人网站,它一点也不疼。在

查看文件

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

表单文件

^{pr2}$

类搜索表单(形式。形式): 搜索=表格.CharField(最大长度=30)

相关问题 更多 >