分页和获取参数

时间:2017-09-03 17:54:21

标签: django

Django 1.11.4

我已经使用method =" get"构建了一个搜索表单。 搜索表单有很多表单。 然后,此输入值将作为url中的get参数传输。

问题是如何获得分页。该数据库包含数千个对象。分页是必要的。

这是文档告诉我们的:

https://docs.djangoproject.com/en/1.11/topics/pagination/#using-paginator-in-a-view

这样建议:​​

<a href="?page={{ contacts.previous_page_number }}">previous</a>

但这会毁掉所有的参数。

我设法发明的是:

<a href="{{ request.get_full_path }}&page={{ object_list.previous_page_number }}">previous</a>

这很有效。但这太愚蠢了。如果向前和向后切换页面,它会生成如下所示的URL:

page=2&page=3&page=2

我已经了解了Google如何解决此问题。在网址的中间,他们的开始= 30。并更改此参数:start = 20,start = 40。所以,他们改变了。

你能帮我理解如何在Django中保存获取参数和切换页面吗?当然是以优雅的方式。

3 个答案:

答案 0 :(得分:1)

通常,要保留GET参数,只需手动重写即可。不应该有很多情况需要这么做。

&page={{page}}&total={{total}}

您可以将其抽象为模板包含或自定义模板标记。

https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/

此外,您可以创建一个字符串过滤器,将URL参数作为字符串以及要更改的值的字典。然后,过滤器可以解析params字符串,更新值,然后将字符串重新组合回URL params。

{{ request.get_full_path | update_param:'page=8' }}

答案 1 :(得分:0)

通用解决方案是定义一个“自定义模板标记”(一个函数),该标记可保留完整的URL,但会更新传递给它的GET参数。

注册后,您可以在模板中使用此功能:

<a href="?{% query_transform page=contacts.previous_page_number %}">previous</a>

要定义和注册自定义模板标签,请将以下代码包含在python文件中:

from django import template

register = template.Library()

@register.simple_tag(takes_context=True)
def query_transform(context, **kwargs):
    query = context['request'].GET.copy()
    for k, v in kwargs.items():
        query[k] = v
    return query.urlencode()

*感谢Ben获得query_transform代码。这是来自his code的python 3的补充。

为什么这种方法比手动重建URL更好:

如果您以后决定在URL中需要其他参数:1.您不必更新模板中的所有链接。 2.您不需要将重构URL所需的所有参数都传递给模板。

答案 2 :(得分:0)

这就是我所做的并且发现更容易。不过,许多方法并不是更好的方法!

        param = ""
        if search_programs:
            qs = qs.filter(title__icontains=search_programs)
            param = param + f"&search_programs={search_programs}"
        if level:
            qs = qs.filter(level__icontains=level)
            param = param + f"&level={level}"
        if category:
            qs = qs.filter(sector__icontains=category)
            param = param + f"&category={category}"
        paginator = Paginator(qs, 16)
        page_number = self.request.GET.get('page')
        page_obj = paginator.get_page(page_number)
        context = {
            'page_obj': page_obj,
            "param": param
        }
        return render(self.request, self.template_name, context)
# in html
 <a href="?page={{ page_obj.next_page_number }}{{param}}" class="page-link">next</a>