2010-02-02 8 views
5

Ho un problema con l'applicazione filtro Django: come nascondere gli elementi che producono risultati zero. Penso che ci sia un metodo semplice per farlo, ma idk come.Nascondi gli elementi del filtro che producono risultati zero nel filtro django

sto usando il LinkWidget su un ModelChoiceFilter, come questo:

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

Che cosa devo fare è filtrare il set di query e selezionare solo il provider che produrrà almeno un risultato, ed escludere gli altri . C'è un modo per farlo?

+0

ciò che è "idk"? per favore usa lo spelling inglese standard. –

+0

idk è "non so", mi spiace –

risposta

3

Fondamentalmente, è necessario applicare i filtri e quindi applicarli di nuovo, ma nel set di query appena generato. Qualcosa di simile a questo:

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

Ora, quando si ha corretto set di query, è possibile ignorare i fornitori in modo dinamico in init:

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

Non abbastanza, ma funziona. Probabilmente dovresti incapsulare quelle due chiamate in un metodo più efficiente sul filtro.

+0

Questo funziona, ma __init__ ha bisogno di * args e ** kw, non solo ** kw. Grazie mille! –

+0

Ciao Mauro, puoi spiegare come hai funzionato. Un frammento di esempio sarebbe utile. – sprezzatura

0

Forse il queryset può essere un chiamabile anziché un oggetto queryset "reale". In questo modo, può essere generato dinamicamente. Almeno questo funziona in Django Models per riferimenti ad altri modelli.

Il callable può essere un metodo di classe nel Modello.

0

Se ho compreso correttamente la tua domanda, credo che desideri utilizzare AllValuesFilter.

import django_tables 

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

Ulteriori informazioni sono disponibili qui: http://github.com/alex/django-filter/blob/master/docs/ref/filters.txt#L77

+0

AllValuesFilter non funziona (http://pastebin.com/pmw7gaxj), i filtri dei risultati non sono "filtrati" ma mostrano tutte le scelte, e il LinkWidget non funziona correttamente (mostra un elenco di numeri invece di il testo della scelta). –

+0

Prova AllValuesFilter con questo ramo: https://github.com/alanjds/django-filter/tree/fix-allvalues-queryset. È appena stata applicata una patch per filtrare dal queryset fornito, non dal queryset dell'intero modello. – alanjds