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
空白编码问题。