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

Python Django-使用多个GET参数在模板中分页,python,django,django-templates,Python,Django,Django Templates,我使用的是Django Paginator,我希望有多个可用的get参数,例如: 页码=1 排序依据=价格 但是,在我的模板标记中,我有: Showing items sorted by {{ SORT_PARAM }}. Showing {{ ITEMS_PER_PAGE }} items per page. {% if has_prev %} <a href="?page={{ prev_page }}">Previous</a> | {% endif %} 单击

我使用的是Django Paginator,我希望有多个可用的get参数,例如: 页码=1 排序依据=价格

但是,在我的模板标记中,我有:

Showing items sorted by {{ SORT_PARAM }}.
Showing {{ ITEMS_PER_PAGE }} items per page.

{% if has_prev %}
<a href="?page={{ prev_page }}">Previous</a> |
{% endif %}
单击上面模板片段中的链接,我将转到

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参数的方法,然后传递这些参数和一个以上的参数?

您可以创建一个“参数字符串”。让我们假设您的代码中有:

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>

使用此方法,您可以自由添加更多分页选项,而无需修改URL.py,您只需在字符串选项的末尾附加选项。这有好处,但也有一些危险:我希望您能够识别风险。

使用Django的分页,这一点看起来更干净了

——保存GET参数很简单

首先将GET参数复制到变量(在视图中):

并通过上下文字典将其发送到模板:

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%}
{%else%}
{%endif%}
{%endif%}

-发布了相同的答案。

尝试创建特殊的模板标签:{%pager\u url page=page\u no items\u per\u page=items\u per\u page sort\u param=sort\u param%}(顺便说一句,如果您从设置中获取了一些参数(即,items\u per\u page),您不需要显式地传递它),谢谢。那可能值得一试这是我的。在Django2中,您可以按原样使用它。
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 ....
GET_params = request.GET.copy()
return render_to_response(template,
                        {'request': request, 'contact': contact, 'GET_params':GET_params}, context_instance=RequestContext(request))
{% 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 %}