Django:jQuery 使用多个查询集自动完成

Django: jQuery autocomplete with multiple queryset

我正在尝试为 django 编写自动完成代码,它将显示多个查询集而不是单个列表,可以在此处找到具有此实现的另一个站点的示例:https://www.uala.it/

现在我可以在查询集中发送两个模型的对象:

def multi_autocomplete(request):
    if request.is_ajax():
        # In base a cosa sta scrivendo l'utente mostro un set di aziende.
        query = request.GET.get("term", "")
        companies = Company.objects.filter(name__icontains=query)
        treatments = Treatment.objects.filter(name__icontains=query)
        results = []
        for company in companies:
            place_json = company.name
            results.append(place_json)
        for treatment in treatments:
            place_json = treatment.name
            results.append(place_json)
        data = json.dumps(results)
    return HttpResponse(data, "application/json")

如您所见,我返回 json.dumps 和来自两个模型的数据,如何更改 ui 以显示不同列中的值,如 [=20] =] 我提供了?

尝试以字典格式发送结果并在自动完成中处理相同的内容ajax响应处理程序,

clist = []
tlist = []

for company in companies:
    clist.append(company.name)
for treatment in treatments:
    tlist.append(treatment)
data = json.dumps({"companies":clist, "treatments":tlist})
return HttpResponse(data, "application/json")

自动完成AJAX处理

$("#input_autocomplete").autocomplete({
        source: function(request, response) {

            $.ajax({
                type:"GET",
                cache:false,
                data:{
                    'term': request.term,
                },
                url: "{% url 'treatment-autocomplete' %}",
                success:function(data) {
                    $("#input_autocomplete").removeClass('ui-autocomplete-loading');
                    $('#companyList').empty();
                    $('#treatmentList').empty();
                    $.each(data['companies'], function(i, item) {
                       $('#companyList').append(item);
                    });
                    $.each(data['treatments'], function(i, item) {
                       $('#treatmentList').append(item);
                    });
                }
           });

        },
        error: function(data) {
            $('#input_autocomplete').removeClass('ui-autocomplete-loading');  
        }
         minLength: 1,
        open: function() {},
        close: function() {},
        focus: function(event,ui) {},
        select: function(event, ui) {}

});

您需要合并两个列表并将其作为响应发送

from django.db.models import F

def multi_autocomplete(request):
    if request.is_ajax():
        query = request.GET.get("term", "")
        companies = Company.objects.filter(name__icontains=query).annotate(value=F('name'), label=F('name')).values('id', 'value', 'label')
        treatments = Treatment.objects.filter(name__icontains=query).annotate(value=F('name'), label=F('name')).values('id', 'value', 'label')
        results = list(companies) + list(treatments)
        data = json.dumps(results)
    else:
        data = 'fail'
    return HttpResponse(data, 'application/json')

您的自动完成处理程序将如下所示。

$("#input_element_id").autocomplete({
     source: "{% url 'url name' %}",
     response: function(event, ui) {
        if (!ui.content.length) {
           var noResult = { value: "", label: "No data found" };
           ui.content.push(noResult);
         }
     },
     select: function (e, ui) {
         if (ui.item.value) {
            //do stuff after user selected option from autocomplete   
         }
     }
});

更新

检查这个 JsFiddle 我认为这会有所帮助。