我已经成功了一个AJAX搜索框,但是相当新,我想知道是否有更好的方法来编写这段代码。我正在使用Python 3.6
和Django 2
。此外,我想显示页面加载的所有条目,当前没有显示任何内容。如果我输入文本并将其删除,那么我的所有条目都会显示,但不会在初始加载时显示。谢谢!
views.py
def search_ajax(request):
if request.method == 'POST':
search_text = request.POST['search_text']
if ',' in search_text:
last,first = search_text.split(",")
name_search = PhoneBook.objects.filter(last_name__istartswith=last.strip()
).filter(first_name__istartswith=first.strip())
else:
name_search = PhoneBook.objects.filter(last_name__istartswith=search_text.strip())
phone_search = search = PhoneBook.objects.filter(number__icontains=search_text.strip())
if search_text != "":
search = list(chain(name_search, phone_search))[:10]
else:
search = list(chain(name_search, phone_search))
print(search)
context={'search':search,}
html = render_to_string('search_ajax_results.html', context)
return HttpResponse(html, content_type="application/json")
ajax_script.js
$(function(){
$('#search_ajax_input').keyup(function(){
$.ajax({
type:"POST",
url:"search-ajax/",
data:{
'search_text': $('#search_ajax_input').val(),
'csrfmiddlewaretoken' : $("input[name=csrfmiddlewaretoken]").val()
},
success: searchSuccess,
dataType: 'html'
});
});
});
function searchSuccess(data, textStatus,jqXHR)
{
$('#search-ajax-results').html(data);
};
答案 0 :(得分:1)
在页面加载时显示所有条目
将ajax调用放在一个单独的函数中,并在keyup和page load
上调用它ajax_script.js
$(function() {
// perform search on page load
search();
$('#search_ajax_input').keyup(search);
});
function searchSuccess(data, textStatus, jqXHR) {
$('#search-ajax-results').html(data);
};
function search() {
$.ajax({
type: "POST",
url: "search-ajax/",
data: {
'search_text': $('#search_ajax_input').val(),
'csrfmiddlewaretoken': $("input[name=csrfmiddlewaretoken]").val()
},
success: searchSuccess,
dataType: 'html'
});
}
更好的服务器端代码
这不是一个广泛的列表,而是一些让你的观点更加pythonic /更不易出错的点
if request.method == 'POST':
变为if request.POST:
search_text = request.POST['search_text']
变为search_text = request.POST.get('search_text')
,
之后使用空格,在分配变量时使用空格环绕=
,但在传递函数kwargs时不使用空格等。if search_text != "":
变为if search_text == "":
使用肯定检查并切换then和else块if search_text:
相当于if search_text != "":
list(chain(name_search, phone_search))
或list(chain(name_search, phone_search))[:10]
,具体取决于if条件,那么为什么要在if phone_search = search = PhoneBook.objects.filter(number__icontains=search_text.strip())
之前在if条件前给它一个值无论如何都要覆盖它?results
或search_results
来表示结果会更有意义,只是search
可能会有些混乱。