我按照Django website的说明创建了自己的SearchForm,但出于某种原因,如果我添加自己的搜索字段,它就不会返回任何结果,即使它应该返回结果。
我的search_indexes.py:
from haystack import indexes
from my.app.models import MyModel
class MyIndexIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.NgramField(document=True, use_template=True)
my_fieldname = indexes.CharField(model_attr='my_fieldname')
def get_model(self):
return MyModel
我的模特:
class MyModel(models.Model):
some_field1 = models.CharField(_('Some field 1'), max_length=255)
some_field2 = models.CharField(_('Some field 2'), max_length=255)
my_fieldname = models.CharField(_('My field name'), max_length=255)
我的搜索表单:
class MySearchForm(SearchForm):
q = forms.CharField(label="Search", max_length=255, required=False)
my_fieldname = forms.CharField(label="MySearchLabel", max_length=255, required=False)
def search(self):
sqs = super(MySearchForm, self).search()
if self.is_valid() and self.cleaned_data['my_fieldname']:
sqs = sqs.filter(my_fieldname=AutoQuery(self.cleaned_data['my_fieldname']))
return sqs
我的urls.py:
urlpatterns += patterns('haystack.views',
url(r'^search/', SearchView(
form_class=MySearchForm
), name='haystack_search'),
)
我已经运行了manage.py rebuild_index,但它没有影响。我的问题是我在这里做错了什么,为什么我没有得到任何结果。如果我用q参数尝试一些查询,结果会正常返回。
答案 0 :(得分:1)
super(MySearchForm, self).search()
执行auto_query()
,默认字段名称为content
...由于您尚未定义此类字段,因此不会返回任何结果...因此我不会执行super
调用,而是使用类似于original one的实现替换 - 但将fieldname
传递给auto_query
:auto_query(querystring, fieldname='text')
。
如果您正在搜索模板,请确保正确定义模板。 (如果您要链接多个filter()
来电,则会将它们与和组合在一起。
另外,根据您使用的搜索引擎,它可能会为您提供一个前端,如果数据被正确编入索引,您可以独立于干草堆进行检查...