使用django haystack搜索模板中的全局搜索栏

时间:2013-03-19 04:30:49

标签: django search django-haystack

我有一个需要搜索2个不同模型的django项目,其中一个模型有3种我需要根据需要过滤的类型。我已经安装了haystack并且在基本意义上工作(使用默认的url conf和我的模型的SearchView以及入门文档中的模板返回结果很好)。

问题是我只能通过使用基本search.html模板中的搜索表单来获得结果,而我正在尝试使用haystack使全局搜索栏工作,但我似乎无法得到它对,我在干草堆文档上没有太多运气。我在这里发现了另一个问题,导致我在我的搜索应用程序中使用以下方法。

我的urls.py在我的search.views中指示“/搜索”到此视图:

def search_posts(request):
    post_type = str(request.GET.get('type')).lower()
    sqs = SearchQuerySet().all().filter(type=post_type)
    view = search_view_factory(
        view_class=SearchView,
        template='search/search.html',
        searchqueryset=sqs,
        form_class=HighlightedSearchForm
        )
    return view(request)

进入的url字符串类似于:

http://example.com/search/?q=test&type=blog

这将从我的全局搜索栏中获取查询字符串,但不返回任何结果,但是如果我从sqs行中删除.filter(type = post_type)部分,我将再次获得搜索结果(尽管没有按帖子类型过滤) 。有任何想法吗?我想我错过了一些相当明显的东西,但我似乎无法解决这个问题。

谢谢, -Sean

编辑:

事实证明,我只是个白痴。我按类型过滤SQS的原因是没有返回结果是因为我的PostIndex类中没有包含类型字段。我将PostIndex更改为:

class PostIndex(indexes.SearchIndex, indexes.Indexable):
      ...
      type = indexes.CharField(model_attr='type')

并重建,现在一切正常。

感谢您的回复!

1 个答案:

答案 0 :(得分:1)

def search_posts(request):
    post_type = str(request.GET.get('type')).lower()
    sqs = SearchQuerySet().filter(type=post_type)
    clean_query = sqs.query.clean(post_type)
    result = sqs.filter(content=clean_query)
    view = search_view_factory(
        view_class=SearchView,
        template='search/search.html',
        searchqueryset=result,
        form_class=HighlightedSearchForm
        )
    return view(request)