2

2つの異なるモデルを検索する必要があるdjangoプロジェクトがあり、モデルの1つには3つのタイプがあり、それに基づいてフィルタリングする必要があります。私はhaystackをインストールし、基本的な意味で動作しています(モデルにデフォルトのURL confとSearchViewを使用し、入門ドキュメントのテンプレートを使用すると、正常に結果が返されます)。

問題は、基本的なsearch.htmlテンプレートの検索フォームを使用してのみ結果を取得でき、グローバル検索バーをhaystackで機能させようとしているのですが、正しく取得できないようです。干し草の山のドキュメントにはあまり幸運がありません。ここで別の質問を見つけたので、検索アプリで次の方法にたどり着きました。

私のurls.pyは、「/search」を私の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')

再構築すると、すべてが機能するようになりました。

返信ありがとうございます!

4

1 に答える 1

2
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)
于 2013-03-19T07:04:00.010 に答える