2010-08-21 5 views
10

Я хочу настроить способ поиска поисковых запросов в поисковых_поле.Django admin search: как переопределить обработчик по умолчанию?

Есть ли способ сделать это без взлома глубоко в код Django или создания абсолютно независимого представления?

Например, я хотел бы вернуть объединение запросов для каждого из элементов querystring.split(). Таким образом, поиск «яблочной панели» будет возвращать результаты с помощью Яблока ИЛИ bar, в отличие от поиска по умолчанию, который применяет оператор И.

+1

Просьба уточнить, какое поведение вы бы хотели достичь. Идеально привести пример. –

+0

Я просто добавил пример –

+0

Я обновил свой ответ, вы можете прочитать его и отредактировать, затем попробуйте – WeizhongTu

ответ

0

можно добавить ModelAdmin метод:

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 

у вас есть запрос здесь, так что большая часть материала может быть вид зависит, в том числе параметров URL, куки, сессии и т.д.

9

Это очень легко сделать это в django 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 
0

Так что я использую код от ответа WeizhongTu и нашел не столь очевидные ошибки в нем. Когда мы пытаемся использовать как фильтрацию и поиск с помощью этого кода, фильтрация омрачена этой линией:

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

Важно использовать предыдущие результаты ТОЛЬКО. Поэтому вы никогда не должны использовать 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 
Смежные вопросы