2010-04-13 25 views
0

所以,我立足我的代碼對三分球的解決方案上:
http://solutions.treypiepmeier.com/2009/12/10/using-jquery-autocomplete-with-django/jQuery的自動完成插件和Django(三分球Piepmeier溶液)

的腳本是:

<script> 
     $(function() { 
     $('#id_members').autocomplete('{{ object.get_absolute_url }}members/lookup', { 
      dataType: 'json', 
      width: 200, 
      parse: function(data) { 
       return $.map(data, function(row) { 
        return { data:row, value:row[1], result:row[0] }; 
       }); 
      } 
      }).result(
       function(e, data, value) { 
        $("#id_members_pk").val(value); 
       } 
      ); 
     } 
    ); 
    </script> 

的views.py:

def members_lookup(request, pid): 
    results = [] 
    if request.method == "GET": 
     if request.GET.has_key(u'q'): 
      value = request.GET[u'q'] 
      # Ignore queries shorter than length 1 
      if len(value) > 2: 

       model_results = Member.objects.filter(
           Q(user__first_name__icontains=value) | Q(user__last_name__icontains=value) 
           ) 
       results = [ (x.user.get_full_name(), x.id) for x in model_results ] 
    json = simplejson.dumps(results) 
    print json 
    return HttpResponse(json, mimetype='application/json') 

問題是:
它會在初始查找後停止優化搜索結果。 例如:
如果我設置len(value)> 2,在我鍵入第三個字符後,它會給我一個建議列表。但如果我繼續輸入第4或第5個字符,則建議列表不會改變。

有關這是爲什麼的任何建議?

+1

是有問題的服務器端或客戶端?如果它是服務器端的,當你在'./manage.py shell'中運行查詢時,你會得到相同的結果嗎?你是否輸入了與第4個和第5個字符會導致不同結果的字符? – istruble 2010-04-13 04:33:23

+0

問題在於客戶端。尤其是代碼的解析部分。我注意到(使用Firebug),當我擺脫了有問題的代碼時,它會按照它應該對每個鍵入的字符點擊數據庫,但它不會解析響應... 是的,第4個和第5個字符是應該進一步縮小結果列表。 – Sally 2010-04-13 16:59:21

回答

0

我解決它通過在jQuery的自動完成功能可以解析更容易的格式從第視點側傳遞字符串。

def members_lookup(request, pid): 
    results = '' 
    if request.method == "GET": 
     if request.GET.has_key(u'q'): 
      value = request.GET[u'q'] 
      # Ignore queries shorter than length 1 
      if len(value) > 2: 
       model_results = Member.objects.filter(
           Q(user__first_name__icontains=value) | Q(user__last_name__icontains=value) 
           ) 
       for r in model_results: 
        results += '%s|%s\n' % (r.user.get_full_name(), r.id) 

    return HttpResponse(results, mimetype='text/html') 

然後在客戶端:

<script> 
$().ready(function() { 
    $("#id_members").autocomplete("{{ object.get_absolute_url }}members/lookup/", { 
     width: 260, 
     minChars: 2, 
     selectFirst: false 
    }); 

    $("#id_members").result(function(event, data, formatted) { 
     if (data) 
      $(this).parent().next().find("input").val(data[1]); 
    }); 
}); 
</script>