Django 使用ListView和动态/过滤查询集进行分页
我有一个基于类的视图,用于在表中显示查询集。我还使用了一些表单集来过滤这个查询集。我正在使用作为Django 使用ListView和动态/过滤查询集进行分页,django,pagination,django-queryset,django-class-based-views,django-pagination,Django,Pagination,Django Queryset,Django Class Based Views,Django Pagination,我有一个基于类的视图,用于在表中显示查询集。我还使用了一些表单集来过滤这个查询集。我正在使用作为generic.ListView类的一部分提供的get\u queryset()方法来过滤显示的结果。下面是我的班级的基本情况: from django.views import generic class UnifiedSingleSearch(generic.ListView): template_name = 'app/foo.html' model = MyModel
generic.ListView
类的一部分提供的get\u queryset()
方法来过滤显示的结果。下面是我的班级的基本情况:
from django.views import generic
class UnifiedSingleSearch(generic.ListView):
template_name = 'app/foo.html'
model = MyModel
paginate_by = 30
def get_queryset(self):
if self.request.POST: # If we got here because of a search submission, filter
return MyModel.objects.filter('Some stuff base on the POST data')
return MyModel.objects.all() # Otherwise, just show everything
因为我使用表单集提交多个搜索条件,所以我必须使用POST请求。在初次提交表单时,页面将使用正确过滤的查询集重新加载。但是,当我尝试使用分页控件时,POST请求被丢弃,页面的行为就好像我要进入MyModel.objects.all()
的第2页,而不是我的筛选子集
使用分页控件时,如何保留过滤后的查询集?
以下是分页控件的HTML:
{% if is_paginated %}
<nav aria-label="Pagination nav">
<ul class="pagination">
{# Back a page #}
{% if page_obj.has_previous %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.previous_page_number }}">❮</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link">❮</span>
</li>
{% endif %}
{# Page numbers #}
{% for i in paginator.page_range %}
{% if page_obj.number == i %}
<li class="page-item active">
<span class="page-link">{{ i }}
<span class="sr-only">(current)</span>
</span>
</li>
{% else %}
<li class="page-item">
<a class="page-link" href="?page={{ i }}">{{ i }}</a>
</li>
{% endif %}
{% endfor %}
{# Next page #}
{% if page_obj.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.next_page_number }}">❯</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link">❯</span>
</li>
{% endif %}
</ul>
</nav>
{% endif %}
{% else %}
<p>No MyModel objects found</p>
{% endif %}
{%if已分页%}
{翻一页}
{%如果页面_obj.has_previous%}
-
{%else%}
-
❮
{%endif%}
{#页码}
{paginator.page_range%}
{%如果页码=i%}
-
{{i}
(当前)
{%else%}
-
{%endif%}
{%endfor%}
{下一页}
{%如果页面_obj.has_next%}
-
{%else%}
-
❯
{%endif%}
{%endif%}
{%else%}
找不到MyModel对象
{%endif%}
切换到GET请求就是答案。分页控件也必须编辑一点以保留传递的查询字符串。它们都应该包括{{request.GET.urlencode}}
,然后像往常一样将页面逻辑添加到末尾。最后看起来像这样:
<li class="page-item">
<a class="page-link" href="?{{ request.GET.urlencode }}&page={{ page_obj.next_page_number }}">❯</a>
</li>
经常通过GET
进行搜索,原因有两个:(a)参数可以很容易地通过下一页传递,(b)由于查询已编码,您可以将URL共享给另一个用户,然后用户也可以获得搜索结果。这也有语义原因;GET的意思是“根据这些参数从服务器上获取信息”,而POST的意思是“使用这些值在服务器上进行更改”,这是有道理的。我做了一些测试,我会试着切换到新的位置。如果行得通,我就把这个关上。