Python django中的分页-原始查询字符串丢失
我使用文档中的代码对数据进行分页:Python django中的分页-原始查询字符串丢失,python,django,Python,Django,我使用文档中的代码对数据进行分页: try: data = paginator.page(request.GET.get('page')) except PageNotAnInteger: page = 1 data = paginator.page(1) except EmptyPage: data = paginator.page(paginator.num_pages) 和一页: <div class="pagination"> &
try:
data = paginator.page(request.GET.get('page'))
except PageNotAnInteger:
page = 1
data = paginator.page(1)
except EmptyPage:
data = paginator.page(paginator.num_pages)
和一页:
<div class="pagination">
<span class="step-links">
{% if data.has_previous %}
<a href="?page={{ data.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
<b>Page</b> {{ data.number }} of {{ data.paginator.num_pages }}
</span>
{% if data.has_next %}
<a href="?page={{ data.next_page_number }}">next</a>
{% endif %}
</span>
</div>
当你点击“page2”时,url就会变成
example.com?page=2 # var1=33&var2=44 is lost
而不是:
example.com?var1=33&var2=44&page=2
我既没有找到标准,也没有找到简单的方法来修复它。我该怎么做
更新:
当然,参数的名称、它们的值以及它们是否存在都是未知的。简单的方法是在模板中包含这些变量:
<a href="?var1={{var1}}&var2={{var2}}&page={{ data.next_page_number }}">next</a>
href="?page={{ paginator.next_page_number }}&{{ parameters }}"
只需将var1
和var2
添加到上下文中即可
如果查询字符串变量来自您的后端,则会出现这种情况。如果它们来自前端/外部,您可以在模板中使用类似的内容,直接编辑模板变量或将值传递到后端 如果在设置中激活django.core.context\u processors.request
,则可以直接从模板中的请求访问参数。看
然后可以直接访问模板中的参数。在这种情况下,您需要筛选页面
参数。你可以这样做:
href="?page={{ data.next_page_number }}{% for key, value in request.GET.items %}{% if key != 'page' %}&{{ key }}={{ value }}{% endif %}{% endfor %}"
get_copy = request.GET.copy()
parameters = get_copy.pop('page', True) and get_copy.urlencode()
context['parameters'] = parameters
另一种可能的解决方案是在视图中构造参数列表。优点:您可以在QueryDict
上使用干净的表达方法
它将是这样的:
href="?page={{ data.next_page_number }}{% for key, value in request.GET.items %}{% if key != 'page' %}&{{ key }}={{ value }}{% endif %}{% endfor %}"
get_copy = request.GET.copy()
parameters = get_copy.pop('page', True) and get_copy.urlencode()
context['parameters'] = parameters
就这样!现在,您可以在模板中使用上下文变量:
<a href="?var1={{var1}}&var2={{var2}}&page={{ data.next_page_number }}">next</a>
href="?page={{ paginator.next_page_number }}&{{ parameters }}"
看,代码看起来干净漂亮
注意:假设context
dict中包含的上下文和paginator
变量中的paginator与YPCrumble的答案类似,下面的代码片段对我适用。但是当有多个参数时,模板文件可能会变得非常拥挤
请注意,应用此解决方案时必须知道参数名称,因此可能无法完全满足您的需要。我使用了上述两种简单解决方案之一。另外,需要注意的是,javascript解决方案(如一些SO帖子中所建议的)可能在这里起作用,但可能会影响SEO,因为页面链接不是真实的URL,在这种情况下,for loop
会导致%20
空白编码问题。