Django AJAX搜索简化/显示所有页面加载

时间:2018-03-29 23:38:59

标签: jquery ajax django python-3.x django-views

我已经成功了一个AJAX搜索框,但是相当新,我想知道是否有更好的方法来编写这段代码。我正在使用Python 3.6Django 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);
    };

1 个答案:

答案 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 /更不易出错的点

  • 检查request.POST直接if request.method == 'POST':变为if request.POST:
  • 要访问字典值,请使用get函数以避免KeyError search_text = request.POST['search_text']变为search_text = request.POST.get('search_text')
  • 关注PEP 8 style guide,例如对字符串使用单引号或双引号但要保持一致,在,之后使用空格,在分配变量时使用空格环绕=,但在传递函数kwargs时不使用空格等。
  • 要提高代码可读性,请对if条件if search_text != "":变为if search_text == "":使用肯定检查并切换then和else块
  • Python自动计算空字符串/零/空数组/等。错误含义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条件前给它一个值无论如何都要覆盖它?
  • 在模板中使用名称resultssearch_results来表示结果会更有意义,只是search可能会有些混乱。