Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django管理搜索:如何覆盖默认处理程序?_Django_Search_Django Admin - Fatal编程技术网

Django管理搜索:如何覆盖默认处理程序?

Django管理搜索:如何覆盖默认处理程序?,django,search,django-admin,Django,Search,Django Admin,我希望自定义搜索字段中搜索查询的方式 有没有一种不深入Django代码或创建完全独立的视图的方法 例如,我想返回querystring.split()中每个项的QuerySet的并集。因此,搜索“apple bar”将返回带有apple或bar的结果,这与应用AND运算符的默认搜索不同 您可以添加ModelAdmin方法: def queryset(self, request): qs = super(MyModelAdmin, self).queryset(request) #

我希望自定义搜索字段中搜索查询的方式

有没有一种不深入Django代码或创建完全独立的视图的方法


例如,我想返回querystring.split()中每个项的QuerySet的并集。因此,搜索“apple bar”将返回带有apple或bar的结果,这与应用AND运算符的默认搜索不同

您可以添加
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参数、cookie、会话等。

在django 1.6中,这样做非常容易

在Django 1.6中新增

import operator
# from django.utils.six.moves import reduce  # if Python 3
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 = reduce(operator.or_, [Q(**{c:v}) for c in search_columns for v in search_term_list])

        queryset = self.model.objects.filter(query_condition)
        # NOTICE, if you want to use the query before
        # queryset = queryset.filter(query_condition)
        return queryset, use_distinct

所以我一直在使用WeizhongTu答案中的代码,发现其中有一个不太明显的错误。当我们尝试对该代码同时使用筛选和搜索时,筛选会被以下行所隐藏:

queryset=self.model.objects.filter(eval(查询条件))

仅使用以前的结果很重要。因此,决不能使用
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

请详细说明您希望实现的具体行为。理想情况下,提供一个示例。我更新了我的答案,您可以阅读并编辑它,然后tryThis中有一个远程代码执行漏洞。不需要使用eval来构建Q对象。@GavinWahl eval是通过
操作符删除的。或者
reduce
,干杯