我在用Django 过滤器 http://django-filter.readthedocs.io过滤一个ListView
如果应用了任何过滤器,希望显示“清除所有过滤器”链接。
由于过滤系统的通用性,我还没有找到实现此目的的直接方法。
到目前为止我唯一想到的就是返回常规查询集get_queryset
如果请求中存在“清除”标志,则视图的方法,但这实际上并没有清除过滤器 - 它只是返回所有数据。
有人对此有解决方案/想法吗?
更新:解决方案
在 Jerin 发表评论后,我决定分两个部分解决这个问题:
有过滤器:
我检查请求中是否包含我在过滤器类中定义的任何字段。我的解决方案看起来有点不同,因为我使用的是基于类的视图,所以我将其抽象到混合中,但如果您使用简单的视图像这儿 http://django-filter.readthedocs.io/en/1.1.0/guide/usage.html#the-view,你可以这样做:
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 %}
这是答案的混合版本(我的和Chris https://stackoverflow.com/users/682583/chris)
你可以放置一个Clear all filters
按钮,这将重定向到您的默认 ListView (/host/end/point/
)。
但一些non-filter parameters
(例如pagination
或其他)可能会出现在 URL 中。因此,更好的选择是检查 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 %}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)