10

検索クエリが挿入されていなくても、選択したファセットに一致するすべての結果を表示したいと考えています。Amazon などの一部のショップ アプリケーションの動作に似ています。

e.g. Show all products which are "blue" and between $10-$100.

検索クエリが指定されていない場合、Haystack は値を返しません。

どうすればそれを回避できますか?

ありがとう!

4

5 に答える 5

12

誰かがまだ探している場合は、haystack コードで提案されている簡単な解決策があります。

https://github.com/toastdriven/django-haystack/blob/master/haystack/forms.py#L34

class SearchForm(forms.Form):
    def no_query_found(self):
    """
    Determines the behavior when no query was found.

    By default, no results are returned (``EmptySearchQuerySet``).

    Should you want to show all results, override this method in your
    own ``SearchForm`` subclass and do ``return self.searchqueryset.all()``.
    """
    return EmptySearchQuerySet()
于 2014-06-13T08:04:40.413 に答える
6

なぜ結果が出ないのか?

haystack 入門ドキュメントにあるものと同様の検索テンプレートを使用していると思います。クエリがない場合、このビューには何も表示されません。

{% if query %}
    {# Display the results #}
{% else %}
    {# Show some example queries to run, maybe query syntax, something else? #}
{% endif %}

2 つ目の問題は、既定の検索フォームのsearch()メソッドが、クエリがない限り実際には何も検索しないことです。

結果の取得

これを回避するために、カスタム検索フォームを使用しています。簡略化されたサンプルを次に示します。

class CustomSearchForm(SearchForm):
    ...
    def search(self):
        # First, store the SearchQuerySet received from other processing.
        sqs = super(CustomSearchForm, self).search()

        if not self.is_valid():
          return sqs

        filts = []

        # Check to see if a start_date was chosen.
        if self.cleaned_data['start_date']:
            filts.append(SQ(created_date__gte=self.cleaned_data['start_date']))

        # Check to see if an end_date was chosen.
        if self.cleaned_data['end_date']:
            filts.append(SQ(created_date__lte=self.cleaned_data['end_date']))

        # Etc., for any other things you add

        # If we started without a query, we'd have no search
        # results (which is fine, normally). However, if we
        # had no query but we DID have other parameters, then
        # we'd like to filter starting from everything rather
        # than nothing (i.e., q='' and tags='bear' should 
        # return everything with a tag 'bear'.)
        if len(filts) > 0 and not self.cleaned_data['q']:
            sqs = SearchQuerySet().order_by('-created_date')

        # Apply the filters
        for filt in filts:
            sqs = sqs.filter(filt)

        return sqs

また、ビューを変更することを忘れないでください。

{% if query or page.object_list %}
    {# Display the results #}
{% else %}
    {# Show some example queries to run, maybe query syntax, something else? #}
{% endif %}

実際、ビューのコードは少しハックです。結果のないクエリなしの検索と、パラメーターのない検索を区別しません。

乾杯!

于 2012-06-24T08:15:44.163 に答える
3

SearchQuerySetを見てください。

SearchIndexで色と価格が定義されている場合、これは可能です。

sqs = SearchQuerySet().filter(color="blue", price__range=(10,100))

models(Model)SearchQuerySetに追加することで、クエリを特定のモデルに制限できます。したがって、クエリをモデルアイテムに限定する場合は、次を使用します。

sqs = SearchQuerySet().filter(color="blue", price__range=(10,100)).models(Item)
于 2012-06-11T12:11:28.113 に答える
1

次のフォームは、クエリ文字列が存在しない場合、すべての結果を表示します。これで、カスタム フィルターを追加できます。

from your_app.forms import NonEmptySearchForm
url(r'^your_url$', 
SearchView(template='search.html',searchqueryset=sqs,form_class=NonEmptySearchForm), name='haystack_search'),

フォーム.py

#Overridding because the default sqs is always none if no query string is present
class NonEmptySearchForm(SearchForm):
    def search(self):
        if not self.is_valid():
            return self.no_query_found()
        sqs = self.searchqueryset.auto_query(self.cleaned_data['q'])
        if self.load_all:
            sqs = sqs.load_all()
        return sqs
于 2012-06-24T08:24:41.190 に答える