2017-08-30 39 views
0

好吧,所以我試圖在用戶在HTML文本輸入中輸入文本時在HTML數據列表標記中顯示相關搜索結果。要做到這一點,我有以下的HTML/JS:Django:AJAX查詢返回當前和以前ResultSet的交集

<input class="search-input" autocomplete="off" id="txtSearch" list="suggestions" onkeyup="searchOpen()" value="{{ query }}" type="text" name="query"> 
<datalist id="suggestions"></datalist> 

<script type="text/javascript"> 

    jQuery.curCSS = function(element, prop, val) { 
     return jQuery(element).css(prop, val); 
    }; 

    function searchOpen() { 
     var search = $('#txtSearch').val() 
     var data = { search: search }; 

     $.ajax({ 
      url: 'ajax/search_suggestions/', 
      data: data, 
      dataType: 'jsonp', 
      jsonp: 'callback', 
      minLength: 3, 
      jsonpCallback: 'searchResult' 
     }); 
    } 

    function searchResult(data) { 

     var dataList = document.getElementById('suggestions'); 

     data.forEach(function(item) { 
      var option = document.createElement('option'); 
      option.value = item; 
      dataList.appendChild(option); 
     }); 
    }; 
</script> 

發送在Django一個AJAX請求這一類基於瀏覽:

class SearchSuggestions(View): 

    def get(self, request): 

     search_term = self.request.GET['search'] 
     query_set = Names.objects.filter(name__istartswith=search_term)[:5] 
     results = [] 

     for r in query_set: 
      results.append(r.name) 

     results = json.dumps(results) 
     # print(results) 
     resp = self.request.GET['callback'] + '(' + results + ');' 

     return HttpResponse(resp, content_type='application/json') 

說我有一個數據庫表具有以下項目:

{ 'AA', 'AB', 'AC', '廣告', 'AE', 'AF'}

如果我鍵入一個字母,如 'A'。我得到的第5個結果,與 '一' 開始:

{ 'AA', 'AB', 'AC', '廣告', 'AE'}

這是預期的行爲。但是,當我鍵入第二個字母時,它會進一步對最初返回的QuerySet進行分片,而不是創建新的Query。所以'ae'返回一個結果,但'af'沒有返回結果。每次用戶輸入文字時,如何創建新的數據庫查詢?

+0

所以,它及彼車:'query_set = Names.objects.filter(name__istartswith = SEARCH_TERM)[5]' – Hackerman

+0

正確的,這就是我做了查詢,切它。但這是我第一次使用AJAX,所以我不知道我是否在前端做了任何錯誤的事情,以使它在這條線上出現問題。 – Sam

+0

如果你用'query_set = Names.objects.all()替換那行'filter(name__istartswith = search_term)[:5]' ' – Hackerman

回答

0

我懷疑AJAX計時問題。 $ .ajax()可能需要一段時間才能運行。您正在嘗試在AJAX調用之外構建數據,並且可能會在下一次調用時前一個調用仍在運行,或者類似的情況。 alert()會有效地使事情放慢速度。嘗試:

function searchOpen() { 
    $.ajax({ 
     url: 'ajax/search_suggestions/', 
     data: { search: $('#txtSearch').val(); }, 
     dataType: 'jsonp', 
     jsonp: 'callback', 
     minLength: 3, 
     jsonpCallback: 'searchResult' 
    }); 
} 
+0

感謝您的建議,我認爲您可能會做出某些改變,但會有一些變化,但st生病不太對。現在,它在我繼續打字時起作用,但如果我刪除文本並嘗試不同的搜索(而不是提交),它的行爲與以前一樣;從第一個查詢集中搜索第二個查詢字符串。 – Sam

+0

而不是alert()使用console.log()。這不會有與alert()相同的延遲級別,但會讓您看到正在發送的內容。另一件事是看網絡日誌。在Firefox或Chrome Web Developer Extensions(或類似的東西 - 名稱因瀏覽器而異)中,所有這些都很簡單。 – manassehkatz

+0

嗯。 'console.log(搜索)'打印正確的查詢。網絡標籤似乎顯示了一切(預計在200〜300毫秒左右)。雖然有很多信息,所以我仍在仔細觀察。 – Sam