【问题标题】:Pagination in django - the original query string gets lostdjango 中的分页 - 原始查询字符串丢失
【发布时间】: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

标签: python django


【解决方案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>
    

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

    【讨论】:

      猜你喜欢
      • 2011-02-01
      • 2018-09-22
      • 2021-10-07
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      相关资源
      最近更新 更多