好吧,所以我試圖在用戶在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'沒有返回結果。每次用戶輸入文字時,如何創建新的數據庫查詢?
所以,它及彼車:'query_set = Names.objects.filter(name__istartswith = SEARCH_TERM)[5]' – Hackerman
正確的,這就是我做了查詢,切它。但這是我第一次使用AJAX,所以我不知道我是否在前端做了任何錯誤的事情,以使它在這條線上出現問題。 – Sam
如果你用'query_set = Names.objects.all()替換那行'filter(name__istartswith = search_term)[:5]' ' – Hackerman