2011-12-05 81 views
4

我使用的是Django的分页程序分页的模板,我希望有多个可用GET参数,如: 页面= 1 sort_by =价格Django的 - 使用多个GET参数

然而,在我的模板标签我有:

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参数。

一个解决方案是我可以输入所有的A HREF可能GET参数,如

<a href="?page={{ prev_page }}&items_per_page={{ ITEMS_PER_PAGE }}&sort_param={{ SORT_PARAM }}">Previous</a> 

,但是这将不再是可扩展的更多的参数我想添加到我的浏览。我猜应该有一种自动获取所有GET参数的方法,然后再传递这些参数?

+1

尝试创建特殊的template_tag:ie。 {%pager_url page = page_no items_per_page = ITEMS_PER_PAGE sort_param = SORT_PARAM%}(顺便说一句,如果你从设置中获取一些参数(即ITEMS_PER_PAGE),你不需要明确地传递它) – yedpodtrzitko

+0

谢谢。这可能值得一试 –

回答

2

您可以创建一个'参数字符串'。让我们supose,在你的代码中有:

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':'-'} 
    ... 

那么你可以concatenat选项:

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 .... 

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

0

Django的分页 - 保留GET params为简单。

首页复印的GET PARAMS一个变量(鉴于):

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以处理额外参数条件):

{% 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 - 发布相同的答案。