2017-09-05 59 views
0

我正在使用Django分页,并且一切都工作正常,除了只有一个页面排序。Django分页不会排序第二页

我曾尝试:

if request.method == 'POST': 
    if request.POST.get('sort_by') == 'price': 
     products_list = Product.objects.filter(category = category).order_by('price') 
     selected_sort_price = "selected" 
    elif request.POST.get('sort_by') == 'name': 
     products_list = Product.objects.filter(category = category).order_by('name') 
     selected_sort_name = "selected" 
    elif request.POST.get('sort_by') == 'date': 
     products_list = Product.objects.filter(category = category).order_by('-id') 
     selected_sort_date = "selected" 
    show=request.POST.get('show', 5) 
else: 
    products_list=Product.objects.filter(category = category).order_by('-id') 
... 
page = request.GET.get('page', 1) 
paginator = Paginator(products_list, show) 
try: 
    products = paginator.page(page) 
except PageNotAnInteger: 
    products = paginator.page(1) 
except EmptyPage: 
    products = paginator.page(paginator.num_pages) 

以上仅当有来电后,如果没有呼叫后,则按照创建日期排序工作。

因此,如果用户想按价格排序,他会从下拉菜单中选择价格,然后onchange表单将被提交并且相应地对对象进行排序。问题是,当用户转到第二页时,所有内容都会回到默认值,因为不会发出任何邮寄呼叫,并且以前的发布数据不会保留。

我能做些什么来使排序适用于所有页面?

寻找一些方向,

+1

首先,为什么要使用POST?您不会修改任何服务器数据,只是检索参数,相当于搜索表单或类别链接。所以对于GET,你使用'request.GET'。要处理模板中的动态查询字符串,请查看[here](https://stackoverflow.com/q/5755150/1600649)以获取灵感。 – Melvyn

回答

1

在你看来,你应该使用GET方法获得sort_by PARAM,然后,您可以返回sort_by到模板的下一个页面,你可以尝试:

show=request.POST.get('show', 5) 
sort_by = '-id' 
if reques.GET.get('sort_by'): 
    if reques.GET.get('sort_by') in ['price', 'name', 'date']: 
     sort_by= request.GET.get('sort_by') 

products_list = Product.objects.filter(category=category).order_by(sort_by) 

paginator = Paginator(products_list, show) 
page = request.GET.get('page', 1) 

try: 
    products = paginator.page(page) 
except PageNotAnInteger: 
    products = paginator.page(1) 
except EmptyPage: 
    products = paginator.page(paginator.num_pages) 

return render(request, 'my_template.html', {'products': products, 'sort_by': sort_by}) 

在您的模板,添加sort_by param上一页/下一页链接:

{% for product in products %} 
    ... 
{% endfor %} 

<div class="pagination"> 
    <span class="step-links"> 
     {% if products.has_previous %} 
      <a href="?sort_by={{ sort_by }}&page={{ products.previous_page_number }}">previous</a> 
     {% endif %} 

     <span class="current"> 
      Page {{ products.number }} of {{ products.paginator.num_pages }}. 
     </span> 

     {% if contacts.has_next %} 
      <a href="??sort_by={{ sort_by }}&page={{ products.next_page_number }}">next</a> 
     {% endif %} 
    </span> 
</div> 

我希望这是有用的。

+0

这帮助我走向了正确的方向,谢谢。任何想法如何获得模板current_page数字?是否有像{{products.current_page_number}}这样的基本标签? –

+0

没关系,我刚刚意识到当前页面只是{{products.number}},谢谢。 –

1

像@Melvyn说你应该使用GET方法。当您将敏感信息发送到服务器或将数据保存到服务器时,请仅使用POST。

get方法的一个例子应该是:

if reques.GET.get('sort_by'): 
    prince = request.GET.get('sort_by') 
    products_list = Product.objects.filter(category = category).order_by(price) 
    selected_sort_price = "selected" 

我没有你的项目足够的信息,所以我不能帮你。无论如何告诉我,如果这项工作。

+0

Melvyn对我的部分POST的错误用法是正确的,但这会如何改变?如果用户转到第二页,结果是否仍然像第一页那样排序?我可以通过url传递参数,比如'sort_by = price',我可以通过请求在views.py中访问它,但分页的第二页也不起作用,因为'sort_by = price'会是换成'?page = 2'。 –

+0

嗯,我不知道如何去你的项目,但看看如何使用getover方法来定购它的页面,其相似的东西你正在寻找 –