Django搜索页面与查询分页



你好,我实现了一个简单的搜索表单和搜索视图来显示搜索结果。现在我想给它们繁殖。但是url中的页面出现了问题。我的搜索url看起来像/搜索q=Bla

现在,如果我尝试添加分页,如:/搜索q=布拉?page=2(至少我理解它是这样工作的(它将q=之后的整个字符串带到我的数据库过滤器中。我研究了stackoverflow如何处理搜索和分页,并发现使用了"&amp这是视图代码:

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是像搜索一样构建的?q=第一页的测试。对于其他页面(令人惊讶地有效(是搜索吗?page=2&q=测试。现在我很高兴它能工作,但我不太清楚添加&q={{ query }}是如何解决我的问题的。这是某种通用的RFC吗?我不太明白,因为我只是在检查这方面是如何做到的。实现了它并工作了吗?

查询字符串[wiki]是URL的问号(?(后面的部分。它是由一系列键值对组成的字符串,这些键值对由一个与号(&(分隔。键和值用等号(=(分隔。键和值都是百分比编码[wiki]。正如你所发现的:

page=2&q=Test

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

然而,该代码并不完全是";安全";。如果查询本身包含与号和&等,则这可能导致不正确的查询。您应该使用|urlencode模板过滤器[Django-doc]对值进行百分比编码:

<a class="ml-3" href="?page={{ post_list.next_page_number }}&q={{ query|urlencode}}">nächste</a>

最新更新