Chr*_*tof 6 django django-filter
我正在使用django-filter来过滤 a ListView,并且希望在应用任何过滤器时显示“清除所有过滤器”链接。
由于过滤系统的通用性,我还没有找到实现此目的的直接方法。
到目前为止,我唯一想到的是,get_queryset如果请求中存在“清除”标志,则在视图方法中返回常规查询集,但这实际上并没有清除过滤器 - 它只是返回所有数据。
有人对此有解决方案/想法吗?
更新:解决方案
在 Jerin 发表评论后,我决定分两个部分解决这个问题:
有过滤器:
我检查请求中是否包含我在过滤器类中定义的任何字段。我的解决方案看起来有点不同,因为我使用的是基于类的视图,所以我将其抽象到 mixin 中,但如果您使用像这里这样的简单视图,您可以这样做:
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
})
Run Code Online (Sandbox Code Playgroud)
清除所有过滤器:
一个简单的重定向到您的列表视图:
{% if has_filter %}
<a href="{% url 'products' %}">{% trans 'Clear all filters' %}</a>
{% endif %}
Run Code Online (Sandbox Code Playgroud)
这是答案的混合版本(我和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
})
Run Code Online (Sandbox Code Playgroud)
并在模板中,
{% if has_filter %}
<a href="{% url 'products' %}">{% trans 'Clear all filters' %}</a>
{% endif %}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6596 次 |
| 最近记录: |