django 中的分页 - 原始查询字符串丢失

Posted

技术标签:

【中文标题】django 中的分页 - 原始查询字符串丢失【英文标题】:Pagination in django - the original query string gets lost 【发布时间】:2015-08-13 12:57:12 【问题描述】:

我使用文档中的代码对数据进行分页:

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>

但是这里有一个bug:当url包含查询字符串并且点击Pager时,原始查询字符串会丢失。例如:

example.com?var1=33&var2=44

然后当点击“page2”时,url变成了

example.com?page=2  # var1=33&var2=44 is lost

代替:

example.com?var1=33&var2=44&page=2 

我既没有找到标准,也没有找到简单的方法来修复它。我该怎么做?

更新:

当然,参数的名称、它们的值以及它们是否存在都是未知的。

【问题讨论】:

我使用了here 提到的两个简单解决方案之一。此外,重要的是要注意 javascript 解决方案(如一些 SO 帖子中所建议的)可能在这里工作,但可能会影响 SEO,因为在这种情况下页面链接不会是真正的 URL 【参考方案1】:

如果您在设置中激活django.core.context_processors.request,则可以直接在模板中访问请求中的参数。见https://docs.djangoproject.com/en/1.7/ref/templates/api/#django-core-context-processors-request

然后您可以直接访问模板中的参数。在您的情况下,您需要过滤 page 参数。你可以这样做:

href="?page= data.next_page_number % for key, value in request.GET.items %% if key != 'page' %& key = value % endif %% endfor %"

【讨论】:

这里的for loop 会导致%20 空白编码问题。【参考方案2】:

另一种可能的解决方案是在您的视图中构造参数列表。优点:您可以在 QueryDict 上使用简洁而富有表现力的方法。

它会是这样的:

get_copy = request.GET.copy()
parameters = get_copy.pop('page', True) and get_copy.urlencode()
context['parameters'] = parameters

就是这样!现在您可以在模板中使用 context 变量:

 href="?page= paginator.next_page_number & parameters " 

看,代码看起来干净漂亮。

注意:假设您的上下文包含在 context dict 中,而您的分页器包含在 paginator 变量中

【讨论】:

谷歌搜索此主题后我的首选解决方案。非常整洁!【参考方案3】:

简单的方法是在模板中包含这些变量:

<a href="?var1=var1&var2=var2&page= data.next_page_number ">next</a>

只需将var1var2 添加到您的context

如果查询字符串变量来自您的后端。如果它们来自前端/外部,您可以在模板中使用 How can I get query string values in JavaScript? 之类的东西,然后直接编辑模板变量或将值传递给后端。

【讨论】:

【参考方案4】:

与 YPCrumble 的回答类似,以下 sn-p 对我有用。但是当有多个参数时,模板文件可能会变得非常拥挤。

<a href="?p= page % if search %&search= search % endif %"> page </a>

请注意,应用此方案时必须知道参数名称,因此可能无法完全满足您的需求。

【讨论】:

以上是关于django 中的分页 - 原始查询字符串丢失的主要内容,如果未能解决你的问题,请参考以下文章

django实现分页功能

REST Web 应用程序中的分页

django中的分页器

django分页后查询丢失

13.django之分页

django中的分页