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

时间:2011-12-05 13:40:43

标签: python django django-templates

我正在使用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参数的方法,然后又传递一些这些参数?

3 个答案:

答案 0 :(得分:4)

这一个http://djangosnippets.org/snippets/1592/看起来更干净

答案 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}}&amp;page={{ contacts.next_page_number }}">next</a>
    {% else %}
        <a href="?page={{ contacts.next_page_number }}">next</a>
    {% endif %}
{% endif %}

Source - 发表同样的答案。