在django中更改页面时,如何保持所有查询参数不变?

ff29svar  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(139)

我有这个问题与pagination:
<a href="{{ request.get_full_path }}{% if request.GET %}&{% else %}?{% endif %}page={{ page_obj.previous_page_number }}">previous</a>
它工作得很好,但每次我点击它,它增加了一个?page=1在URL的末尾,所以点击几次后URL看起来像这样:例如:something?query_params=5&page=1&page=1&page=1&page=1
我知道为什么会发生这种情况,这是因为我把它硬编码到URL中,但我必须使用get_full_path,因为我需要其他查询参数和page
所以基本上我想要所有这些查询参数,但没有page=每次更改页面时都会添加一些东西。我只需要一个page查询参数。

rdrgkggo

rdrgkggo1#

您可以有效地删除视图中的页码,如:

class MyView(View):
    # …

    def request_get(self):
        rq = self.request.GET.copy()
        rq.pop(self.page_kwarg, None)
        return rq.urlencode()

那么在视图中,我们可以使用:

<a href="{{ request.path }}?{{ view.request_get }}&amp;page={{ page_obj.previous_page_number }}">previous</a>

我们也可以创建一个helper函数来包含路径:

class MyView(View):
    # …

    def request_get(self):
        rq = self.request.GET.copy()
        rq.pop(self.page_kwarg, None)
        return rq.urlencode()

    def path_without_page(self):
        return f'{self.request.path}?{self.request_get()}'

从而与以下人员合作:

<a href="{{ view.path_without_page }}&amp;page={{ page_obj.previous_page_number }}">previous</a>

然而,有点遗憾的是,页面对象本身不能访问请求对象,因此寻呼机可以构造这样的链接。我个人认为这是Django分页系统的缺点之一。

相关问题