首页 > 解决方案 > 带有查询分页的 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 吗?我不太明白,因为我只是在检查这方面是如何做到的。实施并有效?

标签: htmldjangourldjango-viewsdjango-templates

解决方案


查询字符串[ 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>

推荐阅读