Django管理员搜索:如何覆盖默认处理程序? [英] Django admin search: how to override the default handler?

查看:151
本文介绍了Django管理员搜索:如何覆盖默认处理程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



有没有办法做到这一点,而不是深入Django代码或创建一个完整的独立视图?



例如,我想返回querystring.split()的每个项目的查询集合。所以搜索苹果吧会返回结果与EITHER苹果OR吧,不同于默认的搜索应用AND运算符。

解决方案

在django 1.6中这样做很简单



ModelAdmin.get_search_results(request,queryset, search_term) Django中的新功能1.6。

 从django.db.models导入Q 

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

def get_search_results(self,request ,queryset,search_term):
#search_term是您在管理站点中输入的
#queryset是搜索结果
queryset,use_distinct = super(PersonAdmin,self).get_search_results(request,queryset,search_term )

search_term_list = search_term.split('')#['apple','bar']
#你也可以使用`self.search_fields`而不是跟随'search_columns`
search_columns =('name','age','address')
#convert to Q(name ='apple')| Q(name ='bar')| Q(age ='apple')| ...
query_condition ='| '.join(search_columns中y的search_term_list中的['Q(%s =%s)'%(x,y)])
queryset = self.model.objects.filter(eval(query_condition ))

return queryset,use_distinct


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 independent view?

For instance, I would like to return the union of the querysets for each of the items of the querystring.split(). So that searching for "apple bar" would return results with EITHER apple OR bar, unlike the default search which applies an AND operator.

解决方案

It is very easy to do this in django 1.6

ModelAdmin.get_search_results(request, queryset, search_term) New in 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

这篇关于Django管理员搜索:如何覆盖默认处理程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆