使用django-filter

时间:2018-04-09 11:55:19

标签: django django-filter

我正在使用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 %}

3 个答案:

答案 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)缓存了吗?我可以强迫锚中的某些东西不使用它们吗?

回答了我自己的问题,但对于路过的其他人: 我在过滤器表单中的按钮上放置了锚点,尽管它不是将按钮移到表单外部的提交按钮,但可以达到预期的结果。