Django -在模板中使用多个GET参数分页



我正在使用一个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}}&amp;page={{ contacts.next_page_number }}">next</a>
    {% else %}
        <a href="?page={{ contacts.next_page_number }}">next</a>
    {% endif %}
{% endif %}

来源-张贴相同的答案

最新更新