2010-02-02 110 views
5

我有一个Django过滤器应用程序的问题:如何隐藏将产生零结果的项目。我认为有一个简单的方法来做到这一点,但idk如何。隐藏Django过滤器产生零结果的过滤器项目

我使用一个ModelChoiceFilter的LinkWidget,就像这样:

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

我需要做的是过滤查询集并只选择能产生至少一个结果的提供者,并排除他人。 有一种方法可以做到这一点?

+0

什么是 “IDK的”?请使用标准英文拼写。 – 2010-02-02 12:52:21

+0

idk是“我不知道”,对不起 – 2010-02-03 09:03:29

回答

3

基本上,您需要应用筛选器,然后再应用它们,但是应用于新生成的查询集。事情是这样的:

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

现在,当你有正确的查询集,可以动态地在初始化覆盖供应商:

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

不漂亮,但它的工作原理。你可能应该将这两个调用封装成更有效的过滤方法。

+0

这是有效的,但__init__需要* args和** kw,而不是** kw。 非常感谢! – 2010-02-16 10:28:46

+0

嗨毛罗,你能解释一下你是如何得到这个工作的。一个示例片段将会有所帮助。 – sprezzatura 2013-03-28 13:49:59

0

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

可调用可以是您的Model中的类方法。

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

+0

AllValuesFilter不起作用(http://pastebin.com/pmw7gaxj),结果过滤器没有“过滤”,但它显示所有的选择,并且LinkWidget无法正常工作(它显示的是一个数字列表,而不是选择的文字)。 – 2010-03-13 11:50:17

+0

尝试使用此分支的AllValuesFilter:https://github.com/alanjds/django-filter/tree/fix-allvalues-queryset。只修补以从提供的查询集过滤,而不是整个模型查询集。 – alanjds 2014-01-22 19:56:42