2010-02-25 4 views
0

J'ai un problème avec le plugin jquery-autocomplete et mon script django. Je veux un plugin autocomplete facile à utiliser. Et pour ce que je vois cela (http://code.google.com/p/jquery-autocomplete/) on a l'air très utile et facile. Pour la partie django je l'utilise (http://code.google.com/p/django-ajax-selects/) je l'ai un peu modifié, car la sortie me paraissait un peu bizarre. Il y avait 2 '\ n' pour chaque nouvelle ligne, et il n'y avait pas d'en-tête Content-Length dans la réponse. D'abord je pensais que cela pourrait être le problème, parce que tous les exemples en ligne que j'ai trouvés les avaient. Mais ce n'était pas le problème.jquery-autocomplete ne fonctionne pas avec mon application django

J'ai une très petite test.html avec le corps suivant:

<body> 
<form action="" method="post"> 
<p><label for="id_tag_list">Tag list:</label> 
<input id="id_tag_list" name="tag_list" maxlength="200" type="text" /> </p> 
<input type="submit" value="Submit" /> 
</form> 
</body> 

Et ceci est l'appel JQuery ajouter autocomplete à l'entrée.

function formatItem_tag_list(row) { 
    return row[2] 
} 
function formatResult_tag_list(row) { 
    return row[1] 
} 

$(document).ready(function(){ 
    $("input[id='id_tag_list']").autocomplete({ 
     url:'http://gladis.org/ajax/tag', 
     formatItem: formatItem_tag_list, 
     formatResult: formatResult_tag_list, 
      dataType:'text' 
    }); 
}); 

Quand je tape quelque chose dans le champ de texte Firefox (Firebug) et Chrome navigateur indique que ther est un appel ajax, mais sans réponse. Si je copie juste la ligne dans mon navigateur, je peux voir la réponse. (ce problème est résolu, il était une caractéristique de sécurité de ne pas obtenir ajax les données d'un autre domaine)

Par exemple, lorsque je tape Bi dans le champ de texte, l'URL "... http://gladis.org/ajax/tag?q=Bi&max est généré. Lorsque vous entrez dans votre navigateur vous obtenez cette réponse:

4|Bier|Bier 
43|Kolumbien|Kolumbien 
33|Namibia|Namibia 

maintenant mon appel ajax obtenir la réponse correcte, mais il n'y a toujours pas de liste montrant toutes les entrées possibles J'ai aussi essayé de formater la sortie, mais ce doesn. Je n'ai pas travaillé non plus, j'ai mis des freins à la fonction et je me suis rendu compte qu'ils ne seront pas appelés du tout. 210 Voici un lien vers mon fichier HTML minimum http://gladis.org/media/input.html

Quelqu'un at-il une idée de ce que j'ai fait de mal. J'ai également téléchargé tous les fichiers sous la forme d'un petit zip au http://gladis.org/media/example.zip .

Nous vous remercions de votre aide!

[Modifier] voici les urls conf:

(r'^ajax/(?P<channel>[a-z]+)$', 'ajax_select.views.ajax_lookup'), 

et la configuration du canal de recherche ajax

AJAX_LOOKUP_CHANNELS = { 
    # the simplest case, pass a DICT with the model and field to search against : 
    'tag' : dict(model='htags.Tag', search_field='text'), 
} 

et la vue:

def ajax_lookup(request,channel): 
    """ this view supplies results for both foreign keys and many to many fields """ 

    # it should come in as GET unless global $.ajaxSetup({type:"POST"}) has been set 
    # in which case we'll support POST 
    if request.method == "GET": 
     # we could also insist on an ajax request 
     if 'q' not in request.GET: 
      return HttpResponse('') 
     query = request.GET['q'] 
    else: 
     if 'q' not in request.POST: 
      return HttpResponse('') # suspicious 
     query = request.POST['q'] 

    lookup_channel = get_lookup(channel) 

    if query: 
     instances = lookup_channel.get_query(query,request) 
    else: 
     instances = [] 

    results = [] 
    for item in instances: 
     results.append(u"%s|%s|%s" % (item.pk,lookup_channel.format_item(item),lookup_channel.format_result(item))) 

    ret_string = "\n".join(results) 
    resp = HttpResponse(ret_string,mimetype="text/html") 
    resp['Content-Length'] = len(ret_string) 
    return resp 

Répondre

1

Vous avez probablement besoin une barre oblique à la fin de l'URL.

De même, votre sélecteur jQuery est incorrect. Vous n'avez pas besoin de guillemets dans les crochets. Cependant, ce sélecteur est mieux écrit comme cela de toute façon:

$("input#id_tag_list") 

ou tout simplement

$("#id_tag_list") 
+0

Non, je n'ai pas besoin de la barre oblique. En fait, cela ne marchera pas avec un. C'est à cause de la configuration de l'URL. Comme je l'ai dit ci-dessus, quand je fais face à l'URL et que je la colle dans le navigateur, tout fonctionne correctement. Mais merci pour le conseil avec les sélecteurs! –

0

En aparté, en supposant que votre document.ready est dans votre modèle Django, ce serait une bonne idée d'utiliser la balise {% url%} plutôt que le codage en dur de votre URL.De cette façon, l'extrait JS sera rendu avec l'URL calculée et votre code restera portable.

+0

Bien sûr, quand je convertis cela en un modèle de django, je vais le changer. Mais maintenant je veux que cette autocomplete fonctionnera aussi pour ma version statique. S'il y a trop de rendu, il sera difficile de trouver la véritable erreur. –

+0

Peut-être que vous pouvez poster vos URL pertinentes conf et voir? –

1

Séparez la réponse parce que je viens de penser à une autre possibilité: votre page statique est-elle servie à partir du même domaine que l'appel Ajax (gladis.org)? Sinon, la politique du même domaine empêchera le chargement d'Ajax.

+0

non, maintenant je l'utilise comme un fichier local. Et ouvrez-le avec le fichier: /// ... Je vais télécharger mon fichier et le vérifier à nouveau. Thx –

+0

Je viens de télécharger le fichier et a obtenu un retour. Donc c'était la bonne direction !!! Malheureusement, la saisie semi-automatique ne fonctionne toujours pas. Je mets aussi les fonctions format_item, et format_result à l'intérieur. –

Questions connexes