Haystack更改SearchForm的SearchQuerySet
我想要自定义一个搜索表单的搜索查询集,这样可以搜索到所有可能的结果,就像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