【问题标题】:Pagination when search and results are on the same page搜索和结果在同一页面上时的分页
【发布时间】:2020-02-22 18:10:00
【问题描述】:

我有一个template,用户在其中传递一个查询并选择几个复选框(这些复选框的范围可以从 1 到 100)。然后,我的view 执行以下操作:

def search(request):
    results_list = search(request.GET.get("q", ""), request.GET.getlist("c"))

    # Pagination
    paginator = Paginator(results_list, 10)
    page = request.GET.get("page")
    results = paginator.get_page(page)

    return render(
        request,
        "web/search/show.html",
        {
            "query": query,
            "results": results,
        },
    )

出现问题是因为搜索和结果的呈现都发生在同一页面上。因此,当我想在我的模板中包含分页时,我必须执行以下操作:

<div class="pagination">
    <div class="step-links">
        {% if results.has_previous %}
        <a href="?page={{ results.previous_page_number }}&{{request.GET.urlencode}}" class="prev-page-link">Previous</a>
        {% endif %}

        {% if results %}
        <span class="current">
            Page {{ results.number }} of {{ results.paginator.num_pages }}
        </span>
        {% endif %}

        {% if results.has_next %}
        <a href="?page={{ results.next_page_number }}&{{request.GET.urlencode}}" class="next-page-link">Next</a>
        {% endif %}
    </div>
</div>

请考虑request.GET.urlencode 的用法,因为当用户想要转到上一页或下一页时,需要传递相同的querycheckboxes。但是,当用户通过第二页时,这会产生一个错误,因为?page=3&amp;page=2 会不断堆积。有人可以为我指出解决此问题的正确方向吗?

【问题讨论】:

    标签: python django django-views


    【解决方案1】:

    一个简单的解决方案是重复链接中需要处理的每个 GET 参数,而不是使用完整的查询字符串,例如:

    <a href="?page={{ results.next_page_number }}&q={{request.GET.q|urlencode}}&c={{request.GET.c|urlencode}}" class="next-page-link">Next</a>
    

    更优雅的解决方案是创建一个 Django 模板标记,以根据查询字符串的当前状态构建 URL,类似于本文中描述的内容:Dealing With QueryString Parameters

    【讨论】:

    • 嘿@bug,感谢您的帮助(+1)。但是,这并不能帮助我检索已选择的所有复选框,而只能检索第一个。您知道如何从所有复选框中获取值吗?谢谢!
    猜你喜欢
    • 2023-03-16
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多