2017-11-15 6 views
1

우수한 django 필터 응용 프로그램을 사용하여 모델 개체의 쿼리 세트를 필터링하고 있습니다. 그러나 뷰의 쿼리 세트에서 객체를 제외하면 템플릿의 필터 선택기는 여전히 사용 가능한 모든 옵션을 표시합니다. 심지어 쿼리 세트에서 제외 된 객체의 옵션까지도 표시합니다. 다음의 내 모델과 뷰의 모양을 가정 해 봅시다 :django-filter : 쿼리 세트에 포함 된 필터 옵션 만 표시

#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) 
[...] 

를 데이터베이스에 두 동물이 있습니다 가정 : 나는 템플릿의 필터를 렌더링 할 때

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

, 내가 제대로 지역에 대한 선택기를 얻을 어떤 유럽과 아프리카 두 가지 옵션이 있습니다. 그러나 내가보기에 몇 가지 논리를 사용하는 경우 .exclude하는()이 같은 검색어 세트에서 객체 : 나는 템플릿의 필터 나는 아직도 두 가지 옵션을 얻을 렌더링 경우 지금

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

유럽아프리카 지역에 대한 비록 queryset에는 아프리카 지역을 가진 동물 하나만 포함되어 있습니다. 템플릿에서 렌더링되는 영역 필드에 올바른 옵션을 어떻게 얻을 수 있습니까? 어떤 도움이라도 대단히 감사합니다.

답변

0

FilterSet.__init__()에있는 choices을 덮어 써서 지역 선택 사항이 제공된 queryset을 기반으로하는 지역으로 제한 될 수 있습니다.

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 

참고 : 테스트하지는 않았지만 올바른 방향으로 안내 할 수 있으면 충분합니다.