我对django-filter应用程序有一个问题:如何隐藏将产生零结果的项目。我认为有一种简单的方法可以做到这一点,但是idk如何。
我在ModelChoiceFilter上使用LinkWidget,如下所示:
provider = django_filters.ModelChoiceFilter(queryset=Provider.objects.all(),
widget=django_filters.widgets.LinkWidget)
我需要做的是过滤查询集并仅选择将产生至少一个结果的Provider,并排除其他结果。 有办法做到这一点吗?
答案 0 :(得分:3)
基本上,您需要应用过滤器,然后再次应用它们,但是在新生成的查询集上。像这样:
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)
不漂亮,但它有效。您应该将这两个调用封装在过滤器上更有效的方法中。
答案 1 :(得分:0)
也许查询集可以是可调用的而不是“真实的”查询集对象。这样,它可以动态生成。至少这在Django模型中适用于其他模型的引用。
callable可以是Model中的类方法。
答案 2 :(得分:0)
如果我理解你的问题,我相信你想要使用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