我正在使用Django Paginator,我希望有多个可用的get参数,例如: 页= 1 sort_by =价格
但是,在我的模板标签中,我有:
Showing items sorted by {{ SORT_PARAM }}.
Showing {{ ITEMS_PER_PAGE }} items per page.
{% if has_prev %}
<a href="?page={{ prev_page }}">Previous</a> |
{% endif %}
但是,这不会保留其他GET变量。我的意思是,如果我正在观看
page/?page=1&sort_by=price
然后点击上面模板片段中的链接,我将转到
page=2
而不是
page=2&sort_by=price
我的意思是,a href不保留其他GET参数。
一种解决方案是我可以在a href中输入所有可能的GET参数,例如
<a href="?page={{ prev_page }}&items_per_page={{ ITEMS_PER_PAGE }}&sort_param={{ SORT_PARAM }}">Previous</a>
但是,我希望添加到浏览中的参数越多,这种可扩展性就越低。我猜应该有一种自动获取所有GET参数的方法,然后又传递一些这些参数?
答案 0 :(得分:4)
答案 1 :(得分:2)
您可以创建'参数字符串'。让我们在您的代码中使用:
my_view( request, page, options):
sort_choices = {P:'price',N:'name', ...}
n_item_choices = {'S':5, 'L':50, 'XL':100)
ascending_descending_choices = {'A':'', 'D':'-'}
...
然后您可以将选项连接为:
options='P-S-D' #order by price, 5 items per page, descending order
将opions编码为:
<a href="?page={{ prev_page }}&options={{ options }}">Previous</a>
然后,在urls.py捕获选项和视图中:
my_view( request, page, options):
... #choides ....
try:
optionsArray = options.split('-')
sort_by = sort_choices[ optionsArray[0] ]
n_ites_page = n_item_choices[ optionsArray[1] ]
asc_or_desc = ascending_descending_choices[ optionsArray[2] ]
...
except:
somebody is playing ....
使用此方法,您可以自由添加更多的paginations选项而无需修改urls.py,您只需在字符串选项的末尾附加选项即可。这有利但也有一些危险:我希望你能识别风险。
答案 2 :(得分:0)
使用Django的分页 - 保留GET参数很简单。
首先将GET参数复制到变量(视图中):
GET_params = request.GET.copy()
并通过上下文字典将其发送到模板:
return render_to_response(template,
{'request': request, 'contact': contact, 'GET_params':GET_params}, context_instance=RequestContext(request))
您需要做的第二件事是使用它在模板中的url调用(href)中指定它 - 一个示例(扩展基本分页html以处理额外的param条件):
{% if contacts.has_next %}
{% if GET_params %}
<a href="?{{GET_params.urlencode}}&page={{ contacts.next_page_number }}">next</a>
{% else %}
<a href="?page={{ contacts.next_page_number }}">next</a>
{% endif %}
{% endif %}
Source - 发表同样的答案。