如何在Django中使用分页和.filter

时间:2019-02-01 16:06:54

标签: django filter pagination

如何同时使用分页和过滤?我有问题,因为他们不想互相工作,没有过滤器分页工作,但是使用过滤器我的应用程序崩溃了。我知道他们是一些如何在堆栈溢出中执行此操作的示例,并且似乎thaat问题在html文件中,但是此示例对我来说是完全可以理解的,如果有人向我展示我必须在代码中进行的更改,我将不胜感激,然后我会更好地理解这一点。我目前正在学习Django,但在理解别人的代码时仍然遇到问题,我非常了解我的代码中我做了什么,但是当我看到别人的代码看起来与我的代码不同时,我不知道发生了什么。

views.py

def Product_list(request, category_slug=None):
 category=None
 categories=Category.objects.all()
 products=Product.objects.all()
 paginator=Paginator(products, 6)
 page=request.GET.get('page')
 products=paginator.get_page(page)

if category_slug:
    category=get_object_or_404(Category, slug=category_slug)
    products=products.filter(category=category)

return render(request, 'shop/product/Product_list.html',
                  {'products':products, 'category':category,
                   'categories':categories,})

product_list.html

<div class='paginator'>
 {% if products.has_previous %}
  <a href='?page1'><<</a>
  <a href='?page={{products.previous_page_number}}'><</a>
 {%endif%}
 {%for num in products.paginator.page_range%}
  {% if products.number == num %}
   <strong>{{num}}</strong>
  {%elif num > products.number|add:'-3' and num < products.number|add:'3' %}
   {{num}}
  {%endif%}
 {%endfor%}
 {% if products.has_next %}
  <a href='?page={{products.paginator.num_pages}}'>>></a>
  <a href='?page={{products.next_page_number}}'>></a>
 {%endif%}
</div>

1 个答案:

答案 0 :(得分:1)

您只能过滤QuerySet。但是在您看来,您是先进行分页(因此products现在是Page),然后尝试过滤该Page对象。您应该仅在之后进行分页,并在最后QuerySet处应用所有过滤器。