2017-11-15 2 views
1

Ich benutze die ausgezeichnete django-filter App, um ein Anfrage-Set von Modellobjekten zu filtern. Wenn ich jedoch Objekte aus dem Abfrage-Set in der Ansicht ausschließe(), zeigen die Filter-Selektoren in der Vorlage weiterhin alle verfügbaren Optionen an, selbst die von Objekten, die ich aus dem Abfrage-Set ausgeschlossen habe. Lassen Sie uns mein Modell sagen und Ansicht wie folgt aussehen:django-filter: zeige nur die Filteroptionen, die im queryset enthalten sind

#model 
[...] 
class Animal(models.Model): 
    REGION_CHOICES = (
     (0, 'Africa'), 
     (1, 'Europe'), 
    ) 

    name = models.CharField(max_length=100) 
    region = models.CharField(choices=REGION_CHOICES, max_length=100) 
[...] 

#view 
[...] 
qs = Animal.objects.all() 
filter = AnimalFilter(request.GET, qs) 
[...] 

dort Unter der Annahme, zwei Tiere in der Datenbank vorhanden sind:

zebra = Animal(name='Zebra', region='Africa') 
frog = Animal(name='Frog', region'Europe') 

Wenn ich den Filter in der Vorlage machen, ich habe einen Selektor für Region korrekt erhalten die enthält die beiden Optionen Europa und Afrika. Aber wenn ich eine gewisse Logik in der Ansicht verwenden, um .exclude() Objekte aus der queryset wie folgt aus:

#view 
[...] 
qs = Animal.objects.all().exclude(name='Frog') 
filter = AnimalFilter(request.GET, qs) 
[...] 

Nun, wenn ich den Filter in der Vorlage machen noch die beiden Optionen Europa ich und Afrika für Region, obwohl das Suchset nur ein Tier mit der Region Afrika enthält. Irgendwelche Ideen, wie ich die richtigen Optionen für das Region-Feld in der Vorlage gerendert bekommen könnte? Jede Hilfe wird sehr geschätzt.

Antwort

0

Sie könnten die choices in Ihrem überschreiben, um sicherzustellen, dass die Regionsauswahl auf die Regionen beschränkt ist, die auf dem bereitgestellten Abfrageset basieren.

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

     regions = self.queryset.values('region').distinct() 
     region_choices = [(k, v) for k, v in REGION_CHOICES if k in regions] 
     self.filters['region'].choices = region_choices 

Hinweis: Ich habe dies nicht getestet, sollte aber hoffentlich genug sein, um Sie in die richtige Richtung zu weisen.

Verwandte Themen