代码之家  ›  专栏  ›  技术社区  ›  Christof

用django过滤器检查并清除过滤器

  •  4
  • Christof  · 技术社区  · 6 年前

    我正在使用 django-filter 过滤a ListView 如果应用了任何筛选器,则希望显示“清除所有筛选器”链接。

    由于过滤系统的通用性,我还没有找到一种简单的方法来实现这一点。

    到目前为止,我唯一想到的是在 get_queryset 如果请求中存在“clear”标志,则视图的方法,但这实际上并没有清除过滤器-它只是返回所有数据。

    有人对此有解决方案/想法吗?

    更新:解决方案

    在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 %}
    
    4 回复  |  直到 6 年前
        1
  •  5
  •   JPG    6 年前

    这是答案的混合版本(我的和 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 %}
    
        2
  •  2
  •   Exis Zhang    6 年前

    只需制作一个按钮并指向基本搜索字段。

    <a class="btn btn-warning" href="{% url 'App:FilterView' %}">Reset</a>
    
        3
  •  0
  •   David Budd    5 年前

    我喜欢这个简单的解决方案,但是当我尝试使用它时,当前的过滤器参数是如何附加到url的,即使它是锚中的基本url。

    因此,将鼠标悬停在按钮“我的链接”(使用 {% url 'app:view' %} 显示 localhost/app/view 正确地

    但是,单击按钮时,浏览器中的url会附加参数 localhost/app/view/?filter1=val1&filter2=val2

    django缓存了什么吗?浏览器(Chrome)是否缓存?我能强迫锚中的东西不使用它们吗?

    我自己回答,但对于其他路过的人: 我在过滤器表单中的一个按钮上设置了锚,尽管它不是一个提交按钮,但将其移到表单之外会得到所需的结果。

        4
  •  0
  •   ehp    3 年前

    如果您的 FilterSet 实例在您可以检查的模板上可用 filter.is_bound 像这样:

    {% if filter.is_bound %}
    <a href="{% url 'list_view_url' %}">Clear filters</a>
    {% endif %}
    

    如果您正在使用 FilterMixin 或者 FilterView 你的 过滤器集 实例将可用为 filter 到上述模板。