0

Alors, je fonde mon code sur la solution de Trey sur:
http://solutions.treypiepmeier.com/2009/12/10/using-jquery-autocomplete-with-django/Jquery plug-in Autocomplete avec Django (Trey solution Piepmeier)

Le script est:

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

Le 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') 

Le problème est: Il cesse d'affiner les résultats de la recherche après la recherche initiale. Par exemple:
Si je règle len (valeur)> 2, après avoir tapé le 3ème caractère, il me donnera une liste de suggestions. Mais si je continue à taper le 4ème ou 5ème caractère, la liste des suggestions ne change pas.

Des suggestions sur pourquoi c'est?

+1

Est-ce le côté serveur ou problème côté client? Si c'est côté serveur, obtenez-vous les mêmes résultats lorsque vous exécutez les requêtes dans './manage.py shell'? Est-ce que vous entrez des caractères qui donneront des résultats différents avec les 4ème et 5ème caractères? – istruble

+0

Le problème est côté client. Surtout la partie analyse du code. J'ai remarqué (en utilisant Firebug) que quand je me suis débarrassé du code incriminé, il frappe la base de données pour chaque caractère tapé comme il est censé, mais il n'analyse pas la réponse ... Oui, le 4ème et 5ème caractère est censé rétrécir la liste des résultats plus loin. – Sally

Répondre

0

Pour côté serveur, je vous recommande de jeter un coup d'oeil une demande de ajax selects

0

Je l'ai résolu en passant une chaîne du côté de la vue dans le format qui jquery autocomplete peut analyser plus facilement.

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

ensuite sur le côté client:

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