Django分页不会排序第二页
我正在使用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
表单将被提交并且相应地对对象进行排序。问题是,当用户转到第二页时,所有内容都会回到默认值,因为不会发出任何邮寄呼叫,并且以前的发布数据不会保留。
我能做些什么来使排序适用于所有页面?
寻找一些方向,
在你看来,你应该使用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>
我希望这是有用的。
这帮助我走向了正确的方向,谢谢。任何想法如何获得模板current_page数字?是否有像{{products.current_page_number}}这样的基本标签? –
没关系,我刚刚意识到当前页面只是{{products.number}},谢谢。 –
像@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"
我没有你的项目足够的信息,所以我不能帮你。无论如何告诉我,如果这项工作。
Melvyn对我的部分POST的错误用法是正确的,但这会如何改变?如果用户转到第二页,结果是否仍然像第一页那样排序?我可以通过url传递参数,比如'sort_by = price',我可以通过请求在views.py中访问它,但分页的第二页也不起作用,因为'sort_by = price'会是换成'?page = 2'。 –
嗯,我不知道如何去你的项目,但看看如何使用getover方法来定购它的页面,其相似的东西你正在寻找 –
首先,为什么要使用POST?您不会修改任何服务器数据,只是检索参数,相当于搜索表单或类别链接。所以对于GET,你使用'request.GET'。要处理模板中的动态查询字符串,请查看[here](https://stackoverflow.com/q/5755150/1600649)以获取灵感。 – Melvyn