検索クエリが挿入されていなくても、選択したファセットに一致するすべての結果を表示したいと考えています。Amazon などの一部のショップ アプリケーションの動作に似ています。
e.g. Show all products which are "blue" and between $10-$100.
検索クエリが指定されていない場合、Haystack は値を返しません。
どうすればそれを回避できますか?
ありがとう!
検索クエリが挿入されていなくても、選択したファセットに一致するすべての結果を表示したいと考えています。Amazon などの一部のショップ アプリケーションの動作に似ています。
e.g. Show all products which are "blue" and between $10-$100.
検索クエリが指定されていない場合、Haystack は値を返しません。
どうすればそれを回避できますか?
ありがとう!
誰かがまだ探している場合は、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()
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 %}
実際、ビューのコードは少しハックです。結果のないクエリなしの検索と、パラメーターのない検索を区別しません。
乾杯!
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)
次のフォームは、クエリ文字列が存在しない場合、すべての結果を表示します。これで、カスタム フィルターを追加できます。
from your_app.forms import NonEmptySearchForm
url(r'^your_url$',
SearchView(template='search.html',searchqueryset=sqs,form_class=NonEmptySearchForm), name='haystack_search'),
#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