2010-02-02 7 views
5

Tengo un problema con la aplicación django-filter: cómo ocultar los elementos que producirán cero resultados. Creo que hay un método simple para hacer esto, pero no sé cómo.Ocultar elementos del filtro que producen cero resultados en django-filter

estoy usando el LinkWidget en un ModelChoiceFilter, así:

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

Lo que necesito hacer es filtrar el conjunto de consultas y seleccione sólo el proveedor que producirá al menos un resultado, y excluir a los demás . Hay una manera de hacer eso?

+0

lo que es "idk"? por favor utiliza la ortografía estándar en inglés. –

+0

idk es "no sé", lo siento –

Respuesta

3

Básicamente, debe aplicar filtros y luego aplicarlos de nuevo, pero en el conjunto de consulta generado recientemente. Algo como esto:

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

Ahora, cuando usted tiene queryset correcta, puede anular los proveedores de forma dinámica en init:

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

No es bonita, pero funciona. Probablemente debería encapsular esas dos llamadas en un método más eficiente en el filtro.

+0

Esto funciona, pero __init__ necesita * args y ** kw, no solo ** kw. ¡Muchas gracias! –

+0

Hola Mauro, ¿puedes explicar cómo trabajaste esto? Un fragmento de muestra sería útil. – sprezzatura

0

Tal vez el conjunto de preguntas puede ser un objeto invocable en lugar de un objeto de conjunto de consultas 'real'. De esta manera, se puede generar dinámicamente. Al menos esto funciona en Django Models para referencias a otros modelos.

El llamable puede ser un método de clase en su Modelo.

0

Si entiendo su pregunta correctamente, creo que desea utilizar AllValuesFilter.

import django_tables 

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

Más información está disponible aquí: http://github.com/alex/django-filter/blob/master/docs/ref/filters.txt#L77

+0

AllValuesFilter no funciona (http://pastebin.com/pmw7gaxj), los filtros de resultados no están "filtrados" pero muestran todas las opciones, y el widget de enlace no funciona correctamente (muestra una lista de números en lugar de el texto de la elección). –

+0

Pruebe AllValuesFilter con esta rama: https://github.com/alanjds/django-filter/tree/fix-allvalues-queryset. Recién parcheado para filtrar desde el conjunto de consultas provisto, no el conjunto de preguntas del modelo completo. – alanjds

Cuestiones relacionadas