一尘不染

如何用其他get变量对Django进行分页?

django

我在Django中使用分页时遇到问题。以下面的URL为例:

http://127.0.0.1:8000/users/?sort=first_name

在此页面上,我按用户的名字对用户列表进行排序。如果没有排序GET变量,则默认按ID排序。

现在,如果我单击下一个链接,则需要以下URL:

http://127.0.0.1:8000/users/?sort=first_name&page=2

相反,我失去了所有的获取变量并最终得到

http://127.0.0.1:8000/users/?page=2

这是一个问题,因为第二页是按ID而不是first_name排序的。

如果我使用request.get_full_path,我最终将得到一个丑陋的URL:

http://127.0.0.1:8000/users/?sort=first_name&page=2&page=3&page=4

解决办法是什么?有没有办法访问模板上的GET变量并替换页面的值?

我正在按照Django文档中的说明使用分页,我的首选是继续使用它。我使用的模板代码与此类似:

{% if contacts.has_next %}
    <a href="?page={{ contacts.next_page_number }}">next</a>
{% endif %}

阅读 322

收藏
2020-04-03

共1个答案

一尘不染

我认为建议的自定义标签太复杂了,这就是我在模板中所做的:

<a href="?{% url_replace request 'page' paginator.next_page_number %}">

和标签功能:

@register.simple_tag
def url_replace(request, field, value):

    dict_ = request.GET.copy()

    dict_[field] = value

    return dict_.urlencode()

如果url_param尚未在url中,则将其添加值。如果已经存在,则将其替换为新值。这是适合我的简单解决方案,但是当url具有多个具有相同名称的参数时,该方法不起作用。

2020-04-03