Django Pagination不会排序第二页

时间:2017-09-05 04:48:20

标签: django pagination

我正在使用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表单,并相应地对对象进行排序。问题是,当用户转到第二页时,所有内容都会恢复为默认值,因为没有发布帖子调用,并且不保留以前的帖子数据。

如何使排序适用于所有页面?

寻找一些方向,

2 个答案:

答案 0 :(得分: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"

我没有足够的项目信息,所以我无法帮助你。无论如何,告诉我是否有这项工作。

答案 1 :(得分:1)

在您的视图中,您应该使用GET方法获取sort_by参数,然后,您可以将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参数添加到上一页/下一页链接:

{% 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>

我希望这很有用。