2017-12-04 18 views
2

내가 대신 하나의 목록으로이 구현이 다른 사이트의 예를 다수의 검색어를 표시 할 장고에 대한 자동 완성을 코딩하는 것을 시도하고 여기에서 찾을 수 있습니다 : 이제 https://www.uala.it/장고 : 복수의 검색어와 jQuery를 자동 완성은

나는 두 모델의 검색어 세트에서 객체를 보낼 수 있었다 :

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") 

당신은 내가 어떻게이 보여 UI를 변경할 수 있습니다, 두 모델의 데이터와 json.dumps를 반환하고 있습니다 볼 수 있듯이 내가 제공 한 링크와 같은 다른 열의 값은 무엇입니까? 사전 처리 포맷으로 결과를 전송하고 자동 완성 Ajax 응답 처리기이를 처리하기

답변

1

당신은 두 목록을 병합하고 응답 모양을

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.

+0

당신이 제공 한 코드가 작동하고, 이미 달성 한 것과 같은 결과입니다. 두 모델의 요소를 가진 단일 목록입니다 ... 그러나 두 개의 다른 목록에서이 결과를 출력하는 방법을 모르겠습니다. – alessioferri20

+0

괜찮습니까? 두 개의 별도 목록을 원하십니까? – Satendra

+0

정확히, 링크에서 제공 한 것처럼 : www.uala.it, 그 사이트에서 두 개의 목록에 결과를 표시하려고하면 : Trattamenti and Saloni. 나는 그런 식으로하는 법을 모른다! – alessioferri20

0

시도

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) {} 

});

+0

"자동 완성 아약스 응답 처리기에서 동일한 처리"는 무엇을 의미합니까? 설명을위한 몇 가지 코드를 보여줄 수 있습니까? 나는 jquery와 잘 맞지 않는다. 실제로는 HTML 파일에 다음과 같은 내용을 포함하고있다 : $ (function() { $ ("# input_autocomplete"). 자동 완성 ({ 소스 : "{% url '치료 - 자동 완성'%}" , minLength : 1, }), }); – alessioferri20

+0

https://www.uala.it/에 표시된대로 표시 하시겠습니까? 하나의 자동 완성 상자에서 검색하고 두 개의 다른 목록에 출력을 표시합니다. –

+0

예 exaclty 그러나 출력을 두 개의 구분 된 목록 (jQuery)에 표시하기 위해 출력을 변경하는 방법이 없습니다. – alessioferri20