带有查询分页的 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。现在我很高兴它可以工作,但我不知道添加&q= query
是如何解决我的问题的。这是某种通用的 RFC 吗?我不太明白,因为我只是在检查这方面是如何做到的。实施它并工作?
【问题讨论】:
【参考方案1】:query string [wiki] 是 URL 的问号 (?
) 之后的部分。它是一个字符串,由一系列键值对组成,由 & 号 (&
) 分隔。键和值由等号 (=
) 分隔。键和值都是percent-encoded [wiki]。所以你发现:
page=2<b>&</b>q=Test
是一个包含两个键值对的查询字符串:page
映射到 2
和 q
以进行测试。
然而,代码并不完全“安全”。如果查询本身包含与符号&
等,则可能导致查询不正确。您应该使用|urlencode
template filter [Django-doc] 对值进行百分比编码:
<a class="ml-3" href="?page= post_list.next_page_number &q= query<b>|urlencode</b> ">nächste</a>
【讨论】:
这是一个很好的答案,wiki 链接也很有帮助。谢谢!如果我输入例如搜索表单中的 Test& 将 url 编码为搜索?q=Test%26,其中没有 |urlencode 过滤器,或者这是不同的东西?以上是关于带有查询分页的 Django 搜索页面的主要内容,如果未能解决你的问题,请参考以下文章
带有分页的 UICollectionView - 设置页面宽度
将分页与查询字符串一起用于搜索表单,该表单的方法设置为进入 codeigniter
带有“加载更多”分页的列表的 BeautifulSoup 子页面