html - 带有查询分页的 Django 搜索页面
问题描述
您好,我已经实现了一个简单的搜索表单和搜索视图来显示搜索结果。现在我想对它们进行分页。但是url中的页面有问题。我的搜索网址看起来像 ../search?q=Bla
现在,如果我尝试添加分页,例如: ../search?q=Bla?page=2 (至少这就是我理解它的工作方式)它会将 q= 之后的整个字符串带到我的数据库过滤器中。我看了一下stackoverflow如何处理搜索和分页,发现使用'&'这里是视图代码:
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 吗?我不太明白,因为我只是在检查这方面是如何做到的。实施并有效?
解决方案
查询字符串[ wiki]?
是URL的问号 ( ) 之后的部分。它是一个字符串,由一系列键值对组成,由 & 号 ( &
) 分隔。键和值由等号 ( =
) 分隔。键和值都是百分比编码的[wiki]。所以你发现:
page=2&q=Test
是一个包含两个键值对的查询字符串:page
映射到2
和q
测试。
然而,代码并不完全“安全”。如果查询本身包含一个 &&
等,那么这可能会导致一个不正确的查询。您应该使用|urlencode
模板过滤器 [Django-doc]对值进行百分比编码:
<a class="ml-3" href="?page={{ post_list.next_page_number }}&q={{ query|urlencode }}">nächste</a>
推荐阅读
- partial-views - .Net Core 3.1 Razor Pages - 如何将控制器传递给布局页面中的部分视图?
- javascript - 如何在不静音的情况下自动播放视频?
- angular - 自定义输入数字选择器中的 ngForm 零值
- swift - Ambiguous column name when joining tables with FluentSQLite
- c# - Returning enum name when returning records from a database
- karate - karate.append not Working with Conditional Check
- google-analytics-api - Limits of Dimensions and Metrics in Google Analytics API V4
- c# - 即时构建应用程序
- c# - 优化 Cypher 查询以处理引号字符
- google-apps-script - Google Script e.values 无法触发