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

时间:2015-05-30 19:08:15

标签: 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">
      <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>

但是这里有一个错误:当url包含查询字符串并且单击寻呼机时,原始查询字符串会丢失。例如:

example.com?var1=33&var2=44

然后当点击“page2”时,网址变为

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

而不是:

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

我既没有找到标准的,也没有找到解决它的简单方法。我怎么能这样做?

更新

当然,参数的名称,它们的值以及它们是否存在尚不清楚。

4 个答案:

答案 0 :(得分:12)

如果您在设置中激活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 %}"

答案 1 :(得分:6)

另一种可能的解决方案是在视图中构建参数列表。优点:您可以在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变量中的分页器

答案 2 :(得分:0)

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

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

只需将var1var2添加到context即可。

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

答案 3 :(得分:0)

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

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

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