我正在使用django-filter过滤ListView
,并希望在应用任何过滤器时显示“清除所有过滤器”链接。
由于过滤系统的通用性,我还没有找到一种直接的方法来实现这一点。
到目前为止我唯一想到的是如果请求中存在“clear”标志,则在视图的get_queryset
方法中返回常规查询集,但这实际上并不清除过滤器 - 它只返回所有数据。
有没有人对此有解决方案/想法?
更新:解决方案
在Jerin评论之后,我决定分两个部分来解决这个问题:
有过滤器:
我检查我在过滤器类中定义的任何字段是否在请求中。我的解决方案看起来有点不同,因为我正在使用基于类的视图,所以我在mixin中将其抽象出来但如果你使用简单的视图like here,你可以这样做:
def product_list(request):
f = ProductFilter(request.GET, queryset=Product.objects.all())
has_filter = any(field in request.GET for field in
set(f.get_fields()))
return render(request, 'my_app/template.html', {
'filter': f,
'has_filter': has_filter
})
清除所有过滤器:
简单重定向到列表视图:
{% if has_filter %}
<a href="{% url 'products' %}">{% trans 'Clear all filters' %}</a>
{% endif %}
答案 0 :(得分:2)
以下是答案的混合版本(我和Chris的组合)
您可以放置一个Clear all filters
按钮,该按钮将重定向到您的默认ListView(/host/end/point/
)。
但是在URL中可能会出现一些non-filter parameters
(例如pagination
或其他内容)。因此,更好的选择是,检查URL中的任何过滤器字段,如果是,则显示过滤器清除链接
选择的解决方案是,
def product_list(request):
f = ProductFilter(request.GET, queryset=Product.objects.all())
has_filter = any(field in request.GET for field in set(f.get_fields()))
return render(request, 'my_app/template.html', {
'filter': f,
'has_filter': has_filter
})
在模板中,
{% if has_filter %}
<a href="{% url 'products' %}">{% trans 'Clear all filters' %}</a>
{% endif %}
答案 1 :(得分:0)
只需单击一个按钮,然后指向基本搜索字段即可。
<a class="btn btn-warning" href="{% url 'App:FilterView' %}">Reset</a>
答案 2 :(得分:0)
我喜欢这个简单的解决方案,但是当我尝试使用它时,当前的过滤器参数是如何附加到url的一些方法,即使它是锚点中的基本url。
因此将鼠标悬停在按钮上,我的链接(由{% url 'app:view' %}
确定)显示
正确localhost/app/view
但是,单击按钮时,浏览器中的url会附加参数
localhost/app/view/?filter1=val1&filter2=val2
等
django是否正在缓存某些内容?浏览器(Chrome)缓存了吗?我可以强迫锚中的某些东西不使用它们吗?
回答了我自己的问题,但对于路过的其他人: 我在过滤器表单中的按钮上放置了锚点,尽管它不是将按钮移到表单外部的提交按钮,但可以达到预期的结果。