【问题标题】:Autocomplete with Django Haystack使用 Django Haystack 自动完成
【发布时间】:2013-01-13 21:28:30
【问题描述】:

我很难让自动完成功能在搜索表单中使用 haystack 和 Solr。按照此处Auto-complete 的说明,我能够通过以下方式创建我的索引。

class PersonIndex(indexes.RealTimeSearchIndex, indexes.Indexable):
    text = CharField(document=True, use_template=True)
    first_name = CharField(model_attr='first_name')
    last_name = CharField(model_attr='last_name')
    first_name_auto = indexes.EdgeNgramField(model_attr='first_name')


    def index_queryset(self):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.all().order_by('first_name')

    def get_model(self):
        return Person

通过我的 URL 路由设置方式,我没有定向到的查看请求,搜索方法有效。

url(r'^search/person/', search_view_factory(
    view_class=SearchView,
    template='index.html',
    form_class=ModelSearchForm
), name='haystack_search'),

说明说我们可以以这种方式执行查询

from haystack.query import SearchQuerySet

sqs = SearchQuerySet().filter(content_auto=request.GET.get('q', ''))

但是我们将这个 SearchQuerySet 放在哪里,我不确定要覆盖什么,如何修改我的 url 以正确路由。我的搜索目前以这种方式开箱即用,但我想尝试使用 EdgeNgramField 自动完成?

【问题讨论】:

    标签: django autocomplete routing django-haystack


    【解决方案1】:

    您需要定义自己的自定义搜索表单并告诉它如何生成返回视图的SearchQuerySet,然后告诉您的search_view_factory 使用该表单而不是ModelSearchForm

    通过覆盖ModelSearchForm 搜索方法,指定您希望生成视图使用的SearchQuerySet 的方式:

    from haystack.forms import ModelSearchForm
    
    class AutocompleteModelSearchForm(ModelSearchForm):
    
        def search(self):
            if not self.is_valid():
                return self.no_query_found()
            if not self.cleaned_data.get('q')
                return self.no_query_found()
            sqs = self.searchqueryset.filter(first_name_auto=self.cleaned_data['q'])
    
            if self.load_all
                sqs = sqs.load_all()
    
            return sqs
    

    这将在first_name_auto 字段上对表单的SearchQuerySet 执行过滤,而不是通常在text 字段上执行的auto_query(请参阅haystack/forms.py 以了解原始搜索功能是什么)看起来)。

    您在search_view_factory 的参数列表中指定要使用此表单

    from path.to.your.forms import AutocompleteModelSearchForm
    
    url(r'^search/person/', search_view_factory(
        view_class=SearchView,
        template='index.html',
        form_class=AutocompleteModelSearchForm
     ), name='haystack_search'),
    

    【讨论】:

    • 首先感谢您的详细解答。我能够遵循搜索方法,该方法看起来与自动设置为 haystack 的方法基本相同。我现在遇到的问题是我无法拉回任何数据。我不确定如何调试它,如果我回到基本的 ModelSearchForm 它可以工作
    • 没问题。您能否阐明“能够遵循与自动设置为干草堆的搜索方法基本相同的搜索方法”是什么意思?你能给我一个你在“q”中的查询的例子,以及你希望它匹配的数据吗?
    • 我的意思是 haystack/forms.py 中的示例,基本上使用您在示例中指定的示例。当我开始在文本字段中输入内容时,什么也没有发生。当我按下回车键时,我收到一个关于“AutocompleteModelSearchForm”对象没有属性“cleaned_date”的错误
    • 啊,'cleaned_date' 应该是 'cleaned_data'。我做了一个type-o。在答案中修复了这个问题。至于您期望的行为(在您键入时出现的结果),这不是 Haystack 提供的功能。 Haystack 自动完成只是将包含子字符串的查询与您正在搜索的字段中的整个单词匹配。如果您追求动态的、键入时下拉的自动完成功能,则需要使用一些 Javascript。 JQuery UI autocomplete 是一个很好的起点。 Haystack 自动完成可以为此提供服务器端的东西。
    • 好的,知道了。那么这个自动完成的用途是什么,现在我收到这个错误'AutocompleteModelSearchForm'对象没有属性'load_All'
    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多