【发布时间】:2014-07-18 20:29:54
【问题描述】:
我想自定义搜索表单的 SearchQuerySet 以搜索所有可能的结果,例如 sql 表达式“LIKE”,文档说:
搜索表单 最基本的表单类型,该表单由单个字段 q 字段(用于查询)组成。搜索时,表单将获取 q 字段的清理内容,并在您提供的自定义 SearchQuerySet 或默认 SearchQuerySet 上执行 auto_query。
要自定义表单将使用的 SearchQuerySet,请将 searchqueryset 参数传递给带有您想使用的 SearchQuerySet 的构造函数。如果将此表单与 SearchView 结合使用,该表单将接收您提供给视图的任何 SearchQuerySet,而无需额外工作。
是否可以将 auto_query 更改为 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
【问题讨论】:
标签: python django search django-haystack