Django admin search: how to override the default handler?

前端 未结 3 963
小鲜肉
小鲜肉 2021-02-14 08:00

I wish to customize the way in which search queries across the search_fields.

Is there a way to do it without hacking deeply into the Django code or creating a totally i

3条回答
  •  栀梦
    栀梦 (楼主)
    2021-02-14 08:59

    So I have been using the code from WeizhongTu's answer and found a not-so-obvious error in it. When we try to use both filtering and searching with this code, filtering is shadowed by this line:

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

    It is important to use the previous results ONLY. So you must never use self.model.objects to obtain the queryset, but only filter the queryset itself. Like this:

    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
    

提交回复
热议问题