Haystack更改SearchForm的SearchQuerySet

0 投票
1 回答
774 浏览
提问于 2025-04-18 07:56

我想要自定义一个搜索表单的搜索查询集,这样可以搜索到所有可能的结果,就像SQL中的“LIKE”表达式一样。文档中提到:

搜索表单(SearchForm)是最基本的表单类型,它只包含一个字段,也就是q字段(用于输入查询内容)。在进行搜索时,表单会获取q字段中清理过的内容,然后对你提供的自定义搜索查询集(SearchQuerySet)或默认的搜索查询集进行自动查询。

如果你想自定义表单使用的搜索查询集,可以在构造函数中传入一个searchqueryset参数,指定你想要使用的搜索查询集。如果你在使用搜索视图(SearchView)时使用这个表单,表单会自动接收你提供给视图的任何搜索查询集,不需要额外的操作。

我可以把自动查询改成一个包含搜索(icontains)吗?

这是我的类,我需要在哪里进行修改?:

class ContactSearchForm(HighlightedModelSearchForm):
    name = forms.CharField(max_length=100,required=False)
    surname = forms.CharField(max_length=100,required=False)
    work = forms.CharField(max_length=100,required=False)
    province =  forms.CharField(max_length=100,required=False)
    status = forms.CharField(max_length=100,required=False)
    sex =  forms.CharField(max_length=100,required=False)
    city =  forms.CharField(max_length=100,required=False)
    street =  forms.CharField(max_length=100,required=False)
    zip =  forms.CharField(max_length=100,required=False)


    def no_query_found(self):
        return self.searchqueryset

    def search(self):
        sqs = super(ContactSearchForm,self).search()

        if not self.is_valid():
            return self.no_query_found()

        if self.cleaned_data['name']:
            sqs = sqs.filter(content__icontains = self.cleaned_data["name"])
        if self.cleaned_data['surname']:
            sqs = sqs.filter(content__icontains = self.cleaned_data['surname'])
        if self.cleaned_data['work']:
            sqs = sqs.filter(content__icontains = self.cleaned_data['work'])
        if self.cleaned_data['province']:
             sqs = sqs.filter(content__icontains = self.cleaned_data['province'])
        if self.cleaned_data['status']:
             sqs = sqs.filter(content__icontains = self.cleaned_data['status'])
        if self.cleaned_data['sex']:
             sqs = sqs.filter(content__icontains = self.cleaned_data['sex'])
        if self.cleaned_data['city']:
            sqs = sqs.filter(content__icontains = self.cleaned_data['city'])
        if self.cleaned_data['street']:
            sqs = sqs.filter(content__icontains = self.cleaned_data['street'])
        if self.cleaned_data['zip']:
            sqs = sqs.filter(content__icontains = self.cleaned_data['zip'])

        return sqs

1 个回答

0

问题在于你调用了父类的搜索方法,而这个方法已经执行了自动查询。你不需要这样做:

sqs = super(ContactSearchForm,self).search()

相反,你的搜索方法应该是这样的:

def search(self):
    if not self.is_valid():
        return self.no_query_found()

    sqs = self.searchqueryset
    for key, value in self.cleaned_data.items():
        if value:
            sqs = sqs.filter(content__icontains=value)

    if self.load_all:
        sqs = sqs.load_all()

    return sqs

撰写回答