2014-09-22 56 views
0

我正在編寫一個簡單的圖書館應用程序(此刻只是一本圖書數據庫),並且我有一個Haystack搜索頁面作爲主頁。我正在嘗試在頁面中添加多個搜索字段,因此您可以專門在標題,作者等中進行搜索,而不僅僅是一次通用的「關鍵字」搜索。我一直在嘗試使用Haystack的「faceting」功能進行這項工作,但它似乎更多地圍繞基於給定嚴格類別的搜索進行細化。使用Haystack構面提供多個搜索字段

您可以使用Haystack構面提供多個搜索字段嗎?或者Haystack只是爲了這種工作而沒有裁剪?如果是這樣,我應該用什麼來代替?

如果您需要更多的上下文,當前項目是available on GitHub

+0

您所使用的搜索表單? – Mubasher 2014-09-24 06:30:55

+0

ModelSearchForm。這種形式增加了新的領域來形成。它遍歷當前SearchSite的所有註冊模型,併爲每個模塊提供一個複選框。如果沒有選擇模型,所有類型將顯示在結果中。 – Mubasher 2014-09-24 06:33:21

+0

@Mubasher請將此擴展爲一個答案,因爲您顯然應該得到賞金! – felixphew 2014-09-24 06:34:54

回答

2

Try ModelSearchForm。這種形式增加了新的領域來形成。它遍歷當前SearchSite的所有註冊模型,併爲每個模塊提供一個複選框。如果沒有選擇模型,所有類型將顯示在結果中。從文檔

定製表單示例,並且可以被轉換爲ModelSearchForm簡單地從ModelSearcForm

from django import forms 
from haystack.forms import SearchForm 


class DateRangeSearchForm(SearchForm): 
start_date = forms.DateField(required=False) 
end_date = forms.DateField(required=False) 

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

    if not self.is_valid(): 
     return self.no_query_found() 

    # Check to see if a start_date was chosen. 
    if self.cleaned_data['start_date']: 
     sqs = sqs.filter(pub_date__gte=self.cleaned_data['start_date']) 

    # Check to see if an end_date was chosen. 
    if self.cleaned_data['end_date']: 
     sqs = sqs.filter(pub_date__lte=self.cleaned_data['end_date']) 

    return sqs 

DATERANGE SearchForm inherting是一個定製的形式並且具有更多的靈活性,因爲它有上側顯影劑更多的控制。創建自己的表單最簡單的方法是從SearchForm(或所需的父項)繼承並擴展搜索方法。通過這樣做,您可以節省大部分正確處理數據的工作,並保持API與SearchView的兼容性。

更多幫助,可以從這個問題django haystack custom form