2010-08-21 2 views
10

search_fields에서 검색 쿼리를 사용자 정의하고 싶습니다.Django 관리자 검색 : 기본 처리기를 무시하는 방법?

Django 코드를 심하게 해킹하거나 완전히 독립적 인보기를 만들지 않아도되는 방법이 있습니까?

예를 들어, querystring.split()의 각 항목에 대해 querysets의 조합을 반환하고 싶습니다. 따라서 "사과 바"를 검색하면 AND 연산자를 적용하는 기본 검색과 달리 apple 또는 bar로 결과가 반환됩니다.

+1

달성하려는 행동을 정확히 설명해주십시오. 이상적으로 예제를 제공하십시오. –

+0

방금 ​​예제를 추가했습니다 –

+0

내 대답이 업데이트되었습니다. 읽을 수 있고 수정 한 다음 시도해 볼 수 있습니다. – WeizhongTu

답변

0

당신은 ModelAdmin 방법을 추가 할 수 있습니다 장고 에서이 작업을 쉽게 1.6

ModelAdmin.get_search_results(request, queryset, search_term) Django 1.6의 새로운 기능.

from django.db.models import Q 

class PersonAdmin(admin.ModelAdmin): 
    list_display = ('name', 'age') 
    search_fields = ('name',) 

    def get_search_results(self, request, queryset, search_term): 
     # search_term is what you input in admin site 
     # queryset is search results 
     queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term) 

     search_term_list = search_term.split(' ')#['apple','bar'] 
     # you can also use `self.search_fields` instead of following `search_columns` 
     search_columns = ('name','age','address') 
     #convert to Q(name='apple') | Q(name='bar') | Q(age='apple') | ... 
     query_condition = ' | '.join(['Q(%s="%s")'%(x,y) for x in search_term_list for y in search_columns]) 
     queryset = self.model.objects.filter(eval(query_condition)) 

     return queryset, use_distinct 
9

그것은 매우있는 물건의 대부분이보기에 의존 될 수 있도록 등 URL 매개 변수, 쿠키, 세션을 포함하여, 여기에 요청을

def queryset(self, request): 
    qs = super(MyModelAdmin, self).queryset(request) 
    # modify queryset here, eg. only user-assigned tasks 
    qs.filter(assigned__exact=request.user) 
    return qs 

:

0

그래서 WeizhongTu의 답변에서 코드를 사용하여 그다지 명백하지 않은 오류가 발견되었습니다. 우리는 모두 필터링을 사용하려고이 코드를 검색 할 때 필터링이 선으로 그림자가되어

queryset = self.model.objects.filter(eval(query_condition))

만 이전 결과를 사용하는 것이 중요합니다. 따라서 당신은 queryset을 얻기 위해 결코 self.model.objects을 사용하지 말아야 만하지만, 쿼리 세트 자체 만 필터링하면됩니다. 이와 같이 :

def get_search_results(self, request, queryset, search_term): 
    # search_term is what you input in admin site 
    # queryset is the list of objects passed to you 
    # by the previous functions, e. g. filtering 
    search_term_list = search_term.split(' ') #['apple','bar'] 
    search_columns = ('name','age','address') 
    # convert to Q(name='apple') | Q(name='bar') | Q(age='apple') | ... 
    query_condition = ' | '.join(['Q(%s="%s")'%(x,y) for x in search_term_list for y in search_columns]) 
    appended_queryset = queryset.filter(eval(query_condition)) 
    # queryset is search results 
    queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term) 
    queryset |= appended_queryset 
    return queryset, use_distinct 
관련 문제