Скрыть элементы фильтра, которые дают нулевые результаты, в django-filter - PullRequest
5 голосов
/ 02 февраля 2010

У меня проблема с приложением django-filter: как скрыть элементы, которые будут давать ноль результатов. Я думаю, что есть простой способ сделать это, но не знаю, как.

Я использую LinkWidget для ModelChoiceFilter, например:

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

Что мне нужно сделать, так это отфильтровать набор запросов и выбрать только поставщика, который выдаст хотя бы один результат, и исключить остальные. Есть способ сделать это?

Ответы [ 3 ]

3 голосов
/ 04 февраля 2010

Как правило, вам нужно применить фильтры, а затем применить их снова, но для вновь созданного набора запросов. Примерно так:

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)

Не красиво, но работает. Возможно, вам следует заключить эти два вызова в более эффективный метод фильтра.

0 голосов
/ 12 марта 2010

Если я правильно понимаю ваш вопрос, я считаю, что вы хотите использовать 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 голосов
/ 02 февраля 2010

Возможно, набор запросов может быть вызываемым вместо «реального» объекта набора запросов.Таким образом, он может генерироваться динамически.По крайней мере, это работает в моделях Django для ссылок на другие модели.

Вызываемый может быть методом класса в вашей модели.

...