我有一个基于类的视图,用于在表中显示查询集。我还使用了几个表单集来过滤此查询集。我正在使用get_queryset()
类中提供的generic.ListView
方法来过滤显示的结果。这基本上是我班级的样子:
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 %}
答案 0 :(得分:0)
切换到GET请求就是答案。分页控件也必须进行一些编辑以保留传递的查询字符串。它们都应包含{{ request.GET.urlencode }}
,然后像往常一样将页面逻辑加到最后。最终看起来像这样:
<li class="page-item">
<a class="page-link" href="?{{ request.GET.urlencode }}&page={{ page_obj.next_page_number }}">❯</a>
</li>