3

検索フォームで haystack と Solr を使用するためにオートコンプリートを取得するのに苦労しています。こちらのオートコンプリートの手順に従って、次の方法でインデックスを作成できました。

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 でオートコンプリートを試してみたいですか?

4

1 に答える 1

1

独自のカスタム検索フォームを定義SearchQuerySetし、ビューに返されるを生成する方法を指定してから、search_view_factoryの代わりにそのフォームを使用するように指定する必要がありModelSearchFormます。

検索メソッドSearchQuerySetをオーバーライドして、ビューで使用されるを生成する方法を指定します。ModelSearchForm

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

これにより、フィールドで通常行うフィルターではなくSearchQuerySet、フィールドでフォームのフィルターが実行されるようになりました(元の検索機能がどのように見えるかを参照してください)。first_name_autoauto_querytexthaystack/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'),
于 2013-01-15T21:51:12.827 に答える