我正在使用一个Django Paginator,我想有多个可用的get参数,例如:页面= 1sort_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
我的意思是,href不保留其他GET参数。
一种解决方案是,我可以在href中键入所有可能的GET参数,例如<a href="?page={{ prev_page }}&items_per_page={{ ITEMS_PER_PAGE }}&sort_param={{ SORT_PARAM }}">Previous</a>
但是当我想要添加更多的参数到我的浏览时,这将变得不那么可伸缩。我猜应该有一个自动的方法来获取所有GET参数,然后传递那些和一个?
这个http://djangosnippets.org/snippets/1592/看起来更干净
您可以创建一个'parameter-string'。假设你的代码中有:
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
将选项编码为:
<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 ....
使用此方法,您可以自由地添加更多分页选项,而无需修改url .py,您所需要的只是在字符串选项的末尾添加选项。这有好处,但也有一些危险:我希望你能识别风险。
使用Django的分页-保存GET参数很简单。
首先将GET参数复制到一个变量(在视图中):
GET_params = request.GET.copy()
并通过context dictionary发送给模板:
return render_to_response(template,
{'request': request, 'contact': contact, 'GET_params':GET_params}, context_instance=RequestContext(request))
你需要做的第二件事是使用它在模板中的url调用(href)中指定它-一个示例(扩展基本分页html以处理额外的参数条件):
{% 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 %}
来源-张贴相同的答案