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>
只需将var1
和var2
添加到您的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 中的分页 - 原始查询字符串丢失的主要内容,如果未能解决你的问题,请参考以下文章