【问题标题】:Hide filter items that produce zero results in django-filter隐藏在 django-filter 中产生零结果的过滤器项目
【发布时间】:2011-01-12 02:02:29
【问题描述】:

我对 django-filter 应用程序有疑问:如何隐藏将产生零结果的项目。我认为有一种简单的方法可以做到这一点,但不知道怎么做。

我在 ModelChoiceFilter 上使用 LinkWidget,如下所示:

provider = django_filters.ModelChoiceFilter(queryset=Provider.objects.all(), 
    widget=django_filters.widgets.LinkWidget) 

我需要做的是过滤查询集并仅选择将产生至少一个结果的提供者,并排除其他结果。 有办法吗?

【问题讨论】:

  • 什么是“idk”?请使用标准英文拼写。

标签: python django filter django-filter


【解决方案1】:

也许查询集可以是可调用的,而不是“真正的”查询集对象。这样,它可以动态生成。至少这在 Django 模型中适用于引用其他模型。

可调用对象可以是模型中的类方法。

【讨论】:

    【解决方案2】:

    基本上,您需要应用过滤器,然后再次应用它们,但在新生成的查询集上。像这样的:

    f = SomeFilter(request.GET) 
    f = SomeFilter(request.GET, queryset=f.qs)
    

    现在,当您拥有正确的查询集时,您可以在 init 中动态覆盖提供程序:

    def __init__(self, **kw):
       super(SomeFilter, self).__init__(**kw)
       self.filters['provider'].extra['queryset'] = Provider.objects.filter(foo__in=self.queryset)
    

    不漂亮,但它有效。您可能应该将这两个调用封装到过滤器上更有效的方法中。

    【讨论】:

    • 这行得通,但 init 需要 *args 和 **kw,而不仅仅是 **kw。非常感谢!
    • 嗨,Mauro,你能解释一下你是如何做到这一点的吗?一个示例 sn-p 会很有帮助。
    【解决方案3】:

    如果我正确理解您的问题,我相信您想使用 AllValuesFilter。

    import django_tables
    
    provider = django_filters.AllValuesFilter(
        widget=django_filters.widgets.LinkWidget)
    

    更多信息请点击此处:http://github.com/alex/django-filter/blob/master/docs/ref/filters.txt#L77

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2020-08-17
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多