【发布时间】:2019-01-31 02:05:02
【问题描述】:
我有一个基于类的视图,用于在表中显示查询集。我还使用了几个表单集来过滤这个查询集。我正在使用作为generic.ListView 类的一部分提供的get_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 %}
【问题讨论】:
-
经常通过
GET进行搜索,原因有二:(a)参数很容易通过下一页,(b)因为查询是编码的,您可以共享URL给另一个用户,该用户随后也获得了搜索结果。 -
还有语义上的原因; GET 表示“根据这些参数从服务器获取信息”,而 POST 表示“使用这些值在服务器上进行更改”,您没有这样做。
-
这是有道理的。我做了一些测试,我会尝试切换到 GET。如果它不起作用,请关闭它。
标签: django pagination django-queryset django-class-based-views django-pagination