带有查询分页的 Django 搜索页面

Posted

技术标签:

【中文标题】带有查询分页的 Django 搜索页面【英文标题】:Django Search Page with Query Pagination 【发布时间】:2021-01-28 21:18:06 【问题描述】:

您好,我已经实现了一个简单的搜索表单和搜索视图来显示搜索结果。现在我想对它们进行分页。但是url中的页面有问题。我的搜索网址看起来像 ../search?q=Bla

现在,如果我尝试添加分页,例如: ../search?q=Bla?page=2 (至少我是这么理解的)它会将 q= 之后的整个字符串带到我的数据库过滤器中。我看了一下***如何处理搜索和分页,发现使用'&'这里是视图代码:

def search(request):
    # get query search parameters
    page = request.GET.get('page', 1)
    query = request.GET.get('q', '')
    # query none or empty
    if query is None or query == '':
        return redirect('home')
    # query valid
    else:
        # icontains make sure to ignore character sensitivity
        post_list = Post.objects.filter(title__icontains=query)
        paginator = Paginator(post_list, 5)
        try:
            posts_l = paginator.page(page)
        except PageNotAnInteger:
            posts_l = paginator.page(1)
        except EmptyPage:
            posts_l = paginator.page(paginator.num_pages)
        return render(request, 'search.html', 'post_list': posts_l, 'query': query)

这里是 HTML 片段:

% if post_list.paginator.num_pages > 1 %
    <div class="pagination">
    <span class="step-links mb-5 mx-auto">
    % if post_list.has_previous %
        <a class="mr-3" href="?page= post_list.previous_page_number &q= query ">zurück</a>
    % endif %
    <span>Seite  post_list.number  von  post_list.paginator.num_pages </span>
    % if post_list.has_next %
        <a class="ml-3" href="?page= post_list.next_page_number &q= query ">nächste</a>
    % endif %
          </span>
    </div>
    % endif %

所以现在 url 像 search?q=Test 一样构建第一页。对于其他页面(令人惊讶的工作)是 search?page=2&q=Test。现在我很高兴它可以工作,但我不知道添加&amp;q= query 是如何解决我的问题的。这是某种通用的 RFC 吗?我不太明白,因为我只是在检查这方面是如何做到的。实施它并工作?

【问题讨论】:

【参考方案1】:

query string [wiki] 是 URL 的问号 (?) 之后的部分。它是一个字符串,由一系列键值对组成,由 & 号 (&amp;) 分隔。键和值由等号 (=) 分隔。键和值都是percent-encoded [wiki]。所以你发现:

page=2<b>&amp;</b>q=Test

是一个包含两个键值对的查询字符串:page 映射到 2q 以进行测试。

然而,代码并不完全“安全”。如果查询本身包含与符号&amp; 等,则可能导致查询不正确。您应该使用|urlencode template filter [Django-doc] 对值进行百分比编码:

&lt;a class="ml-3" href="?page= post_list.next_page_number &amp;q= query<b>|urlencode</b> "&gt;nächste&lt;/a&gt;

【讨论】:

这是一个很好的答案,wiki 链接也很有帮助。谢谢!如果我输入例如搜索表单中的 Test& 将 url 编码为搜索?q=Test%26,其中没有 |urlencode 过滤器,或者这是不同的东西?

以上是关于带有查询分页的 Django 搜索页面的主要内容,如果未能解决你的问题,请参考以下文章

django分页后查询丢失

带有分页的 UICollectionView - 设置页面宽度

将分页与查询字符串一起用于搜索表单,该表单的方法设置为进入 codeigniter

带有“加载更多”分页的列表的 BeautifulSoup 子页面

带有分页的全屏 UICollectionView 内的 UIWebView

Django中使用JS通过DataTable实现表格前端分页,每页显示页数,搜索等功能