2017-08-04 200 views
1

我使用django-filter来为我的网站上的列表视图提供用户过滤。Django只筛选特定于查询集的选项

class MyModel(models.Model): 
    fruit = models.ForeignKey(Fruit) 
    price = models.CharField(...) 
    release_date = models.DateTimeField(...) 

class MyFilter(filters.FilterSet): 
    ... 

    class Meta: 
     model = MyModel 
     fields = ['fruit', 'price', 'release_date'] 

def my_banana_orange_view(request): 
    ... 
    queryset = MyModel.objects.filter(fruit__name__in=['banana', 'orange']) 
    filter = Filter(request.GET, queryset=queryset) 

    return render(request, 'my_template.html', {'queryset': queryset, 'filter': filter}) 

现在,如果我这样做,我可以只显示有两种香蕉或橙关系MyModel项,但MyFilter还是会给予在Fruit模型中所有水果的选择。我试图找到一个FilterSet的设置,只显示与输入查询集有关的选项,但找不到一个。有一个存在吗?

否则我想我将不得不重写过滤器做这样的事情:

class MyFilter(filters.FilterSet): 

    def __init__(self, *args, **kwargs): 
     super().__init__(self, *args, **kwargs) 

     self.filters['fruit'].extra['queryset'] = Fruit.objects.filter(mymodel=self.queryset) 

    class Meta: 
     model = MyModel 
     fields = ['fruit', 'price', 'release_date'] 

这似乎有点大材小用。只显示基于输入查询集的选项似乎是理想的行为,但我找不到任何文档。有没有一个好的方法来做到这一点?任何帮助感谢!

回答

0

FilterSet的第一个参数是data,第二个参数是queryset

请在您的视图中沿着filter = MyFilter(data=request.GET, queryset=queryset)的方向尝试。

请参阅:http://django-filter.readthedocs.io/en/develop/guide/usage.html#the-view

+0

确定我错过了我的示例中的请求信息。尽管如此,仍然可以在下拉列表中的“Fruit”模型中输入所有条目,而不仅仅是查询集中的条目... – DrBuck