Django:具有多个查询集的 jQuery 自动完成

Posted

技术标签:

【中文标题】Django:具有多个查询集的 jQuery 自动完成【英文标题】:Django: jQuery autocomplete with multiple queryset 【发布时间】:2018-05-17 20:14:42 【问题描述】:

我正在尝试为 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 以显示不同列中的值,如我提供的链接中的值?

【问题讨论】:

【参考方案1】:

尝试以字典格式发送结果并在自动完成 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) 

);

【讨论】:

“在自动完成 ajax 响应处理程序中处理相同的内容”是什么意思?你能给我看一些代码来澄清一下吗?我对 jquery 不是很好,实际上我的 html 文件中有这个: $(function() $("#input_autocomplete").autocomplete( source: "% url 'treatment-autocomplete' %", minLength : 1, ); ); 你想像uala.it那样显示吗??您在一个自动完成框中搜索并在另外两个列表中显示输出。 是的,但是,我不知道如何更改输出以将其显示在两个单独的列表中(在 jQuery 中)。【参考方案2】:

您需要合并两个列表并在响应中发送它

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 我认为这会有所帮助。

【讨论】:

您提供的代码正在运行,并且与我已经实现的结果相同,即包含两个模型元素的单个列表...但是我不知道如何输出这个产生两个不同的列表。 完全正确,就像我提供的链接:www.uala.it,在该站点中,如果您尝试它们会在两个列表中显示结果:Trattamenti 和 Saloni。我不知道该怎么做这样的事情! 如何创建根据相关模型(FK 字段)过滤的列表之一?

以上是关于Django:具有多个查询集的 jQuery 自动完成的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest:基于多个查询集的序列化器

如何在 django 中过滤查询集的多对多

具有过滤查询集的组权限的自定义表单

在 Django 中,正确地制作具有多个类别、多个标签和搜索的查询集?

django 注册 redux URL 受具有多个查询参数的 url 影响

具有复杂查询和相当大数据集的本地服务器上的 PostgreSQL 超时