2011-06-22 30 views
1
lcount = Open_Layers.objects.all() 
form = SearchForm() 

if request.method == 'POST': 
    form = SearchForm(request.POST) 
    if form.is_valid(): 
     data = form.cleaned_data 
     val=form.cleaned_data['LayerName'] 

     a=Open_Layers() 
     data = [] 
     for e in lcount: 
      if e.Layer_name == val:  
       data = val 

     return render_to_response('searchresult.html', {'data':data}) 

    else: 
     form = SearchForm() 

else: 
    return render_to_response('mapsearch.html', {'form':form}) 

這只是返回,如果一個特定的「名稱」匹配。如何改變它以便在我搜索「Park」時返回,它應該返回Park1,Park2,Parking,Parkin,即所有公園的出現。如何使這個Django屬性名稱搜索更好?

+0

現在你只是猜測。這不是編程的工作原理。 –

+1

這裏有兩個單獨的問題。請編輯並將第二個單獨發佈。 –

+0

http://stackoverflow.com/questions/6436912/in-django-how-to-make-a-link-out-of-a-search-value-returned在此提出了另一個問題。 – Hick

回答

0

而不是

if e.Layer_name == val:  
    data = val 

使用

if val in e.Layer_name:  
    data.append(e.Layer_name) 

(你不需要線data = form.cleaned_data

1

您可以通過使用一個list積累的結果提高你的搜索邏輯和re模塊匹配更大的一組單詞。

但是,這仍然非常有限,容易出錯,難以維護,甚至難以發展。另外,如果您使用的是搜索引擎,您永遠不會得到好的結果。

因此,您應該花一些時間設置haystack,而不是試圖手動重新發明車輪,汽車和高速公路。現在這是事實上的標準在Django中進行搜索。最初使用woosh作爲後端,這會更容易。如果搜索速度變慢,請用solr替換它。

編輯:

簡單的清潔替代:

Open_Layers.objects.filter(name__icontains=val) 

這將執行一個SQL LIKE,添加%`你。

這會殺死你的數據庫,如果使用太頻繁,但我想這可能不會是你當前的項目的問題。

順便說一句,你可能想重命名Open_LayersOpenLayers,因爲這是Python PEP8的命名約定。

+0

我已經安裝了它。但是,我不需要這樣一個可擴展的搜索。 – Hick

+0

然後你會想要使用包含。我會編輯。 –

+0

我把乾草堆運行起來了。對於我現在的小項目來說似乎太多了,但我相信它會投入使用。任何線索django.core.exceptions.ImproperlyConfigured:HAYSTACK_SITECONF設置不再使用&可以被刪除。 是什麼意思?我的設置完全按照Haystack提到的方式配置 – Hick

0

我意識到這是一個老帖子,但無論如何:

有Python標準庫中的模糊邏輯字符串比較了。

import difflib 

主要看看:

difflib.SequenceMatcher(None, a='string1', b='string2', autojunk=True).ratio() 

更多的信息在這裏: http://docs.python.org/library/difflib.html#sequencematcher-objects

它做什麼它返回的兩個字符串的接近程度的比例,零和1之間。因此,不是測試它們是否相等,而是選擇相似比。

要注意的事情,您可能想要將兩個字符串轉換爲小寫字母。

string1.lower() 

另外請注意,你可能想impliment你最喜歡的分裂重新使用,這樣的「大衛」反對「大衛·布倫特」的搜索排名更高的字符串即.split()或東西的方法。