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中保存获取参数和切换页面吗?当然是以优雅的方式。
答案 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>