使用 django-filter 检查并清除过滤器

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)

JPG*_*JPG 8

这是答案的混合版本(我和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)