2009-11-14 7 views
2

사용자 정의 Django Admin FilterSpec (이미 SO #991926에 적용)에서 작업 중입니다. 내 FilterSpec은 ForeignKey (User)의 기본 필터를 대체하며 모든 사용자의 목록을 기본적으로 3 가지 선택 항목, 모두, 광산 및 기타 항목으로 바꿉니다.부정적 사용자 정의 Django admin FilterSpec

예를 들어 created_by 필드에 맞춤 필터 지정을 적용하면 전체, 작성자 및 기타 작성자로 된 관리 필터가 추가됩니다. 모든 것이 작동합니다 을 제외하고 네거티브 필터, Created by Others.

나는 그래서 쿼리에 __not를 추가하여이를 달성하기 위해 시도했습니다 : 장고 이런 부정적인에서 필터링을 지원하지 않는 것

def choices(self, cl): 
    yield { 
      'selected': self.lookup_val == self.user.pk, 
      'query_string': cl.get_query_string({'%s__not' % self.field.name: self.user.pk}), 
      'display': capfirst('%s Others' % self.field.verbose_name) 
     } 

. 나는 또한 __gte__lte을 가지고 실험했지만 filterspec은 처음 발견 한 (gte) 것을 사용하고 다른 하나는 삭제한다.

누구나 사용자 지정 FilterSpec을 통해 이와 같은 네거티브 필터를 얻는 방법을 알고 있습니까?

답변

4

이 기능은 아직 장고 코드의 일부가 아닙니다. 그것은 버전 1.2를 위해 계획된다. 장고 코드에이 패치를 적용해야합니다 : http://code.djangoproject.com/ticket/5833

FilterSpecget_query_set() 방법을 사용하십시오. 예 :

class AlunoStatus(FilterSpec): 
    def __init__(self, request, params, model, model_admin): 
     self.lookup_val = request.GET.get('exclude_value', None) 

    def get_query_set(self, cl, qs): 
     if self.lookup_val: 
      qs = qs.exclude(field=self.lookup_val) 
     return qs 

    def choices(self, cl): 
     yield {'selected': self.lookup_val is None, 
       'query_string': cl.get_query_string({}, ['exclude_value']), 
       'display': _('All')} 
     for choice in choices: 
      yield {'selected': self.lookup_val == choice, 
        'query_string': cl.get_query_string({'exclude_value': choice}), 
        'display': u"Exclude "+smart_unicode(choice)} 

나는 이것을 테스트하지 않았지만 당신이 아이디어를 얻길 바랍니다.

+0

이것은 최신 SVN 체크 아웃에서만 작동합니다. –

+0

실제로는 그렇지 않습니다. :) 버전 1.2에서는 "중간"우선 순위 기능입니다. Django 1.0에서 http://code.djangoproject.com/ticket/5833 패치를 사용하고 있습니다. – user27478

+0

당신은 장고 라이브러리의 FilterSpec 코드를 살펴 봤고 어디에서 가져 왔는지 궁금합니다. 잠시 트렁크에 들어갈 때까지 기다릴 것이라고 생각하지만,이 get_query_set 메서드를 사용할 수있게하려면 눈을 떼지 않아도됩니다. –

0

부정 작업에 "제외"필터를 사용하지 않겠습니까?

+0

일반적인 쿼리에서는 필터 스펙이'{ 'key': 'value'}'-''.filter (key = value)'형식을 사용합니다. 그러므로 문제. :) –

+0

죄송합니다, 내 나쁜 ... –