2013-01-13 101 views
2

我有一個困難的時間讓自動完成工作與乾草堆和索爾在搜索表單。按照這裏的說明Auto-complete我能夠通過以下方式創建我的索引。自動完成與Django Haystack

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(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自動完成?

回答

1

您需要定義自己的自定義搜索表單並告訴它如何生成SearchQuerySet它返回到視圖,然後告訴search_view_factory使用該表單而不是ModelSearchForm

指定要生成使用您的觀點通過重寫ModelSearchForm搜索方法的SearchQuerySet方式:

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 

現在,這將在first_name_auto現場執行對錶單的SearchQuerySet一個過濾器,而不是auto_query這它通常會在text字段中執行(請參閱haystack/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'), 
+0

首先感謝了詳細的解答。我能夠遵循搜索方法,它與自動設置的乾草堆大致相同。我現在遇到的問題是我無法取回任何數據。我不知道如何調試,如果我回到基本ModelSearchForm它的工作 – Warz

+0

沒問題。你能澄清你的意思嗎?「能夠按照與自動設置的乾草堆大致相同的搜索方法進行搜索」? 你能給我一個你在'q'中查詢的例子,以及你期望它匹配的數據嗎? –

+0

我的意思是來自haystack/forms.py的例子,基本上使用你在例子中指定的例子。當我開始在文本字段中輸入時,沒有任何反應。當我按下回車鍵時,我收到有關'AutocompleteModelSearchForm'對象沒有屬性的錯誤'cleared_date' – Warz