【问题标题】:Django Pagination won't sort second pageDjango Pagination 不会对第二页进行排序
【发布时间】:2017-09-05 15:22:22
【问题描述】:

我正在使用 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)

上述方法仅在有post call时有效,如果没有post call,则按创建日期排序。

因此,如果用户想按价格排序,他将从下拉菜单中选择价格,onchange,表单将被提交并相应地对对象进行排序。问题是,当用户转到第二页时,一切都恢复到默认状态,因为没有进行任何 post 调用,并且没有保留以前的 post 数据。

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

寻找方向,

【问题讨论】:

  • 首先,为什么要使用POST?您没有修改任何服务器数据,只是检索的参数,相当于搜索表单或类别链接。所以对于 GET,你使用request.GET。要处理模板中的动态查询字符串,请查看 here 以获取灵感。

标签: django pagination


【解决方案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>

我希望这很有用。

【讨论】:

  • 这帮助我找到了正确的方向,谢谢。知道如何在模板中获取 current_page 编号吗?有没有像 {{ products.current_page_number }} 这样的基本标签?
  • 没关系,我只是意识到当前页面只是 {{ products.number }},谢谢。
【解决方案2】:

就像@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'。
  • 好吧,我不知道您的项目进展如何,但请查看 stackoverflow 如何使用 get 方法对其页面进行排序,这与您正在寻找的相似
猜你喜欢
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2021-11-11
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多