2009-10-06 8 views
4

Supposons que j'ai une fonction AJAX:Comment utiliser JQuery et Django (ajax + HttpResponse)?

function callpage{ 
$.ajax({ 
    method:"get", 
    url:"/abc/", 
    data:"x="+3 
    beforeSend:function() {}, 
    success:function(html){ 
     IF HTTPRESPONSE = "1" , ALERT SUCCESS! 
    } 
    }); 
    return false; 
} 
} 

Quand mon "View" exécute dans Django, je veux retourner HttpResponse('1') ou '0'.

Comment puis-je savoir si elle a réussi, puis faire cette alerte?

Répondre

16

Le flux de travail type consiste à renvoyer un objet JSON au format texte par le serveur, puis interpret that object in the javascript. Dans votre cas, vous pouvez renvoyer le texte {"httpresponse": 1} du serveur, ou utiliser la librairie python json pour le générer pour vous.

JQuery a une belle JSON-lecteur (je viens de lire les documents, alors il pourrait y avoir des erreurs dans mes exemples)

Javascript:

$.getJSON("/abc/?x="+3, 
    function(data){ 
     if (data["HTTPRESPONSE"] == 1) 
     { 
      alert("success") 
     } 
    }); 

Django

#you might need to easy_install this 
import json 

def your_view(request): 
    # You can dump a lot of structured data into a json object, such as 
    # lists and touples 
    json_data = json.dumps({"HTTPRESPONSE":1}) 
    # json data is just a JSON string now. 
    return HttpResponse(json_data, mimetype="application/json") 

Une alternative Vue proposée par Issy (mignonne parce qu'elle suit le principe DRY)

def updates_after_t(request, id): 
    response = HttpResponse() 
    response['Content-Type'] = "text/javascript" 
    response.write(serializers.serialize("json", 
        TSearch.objects.filter(pk__gt=id))) 
    return response   
+3

Quelqu'un m'a donné une bonne réponse à ce sujet il y a quelques semaines: http://stackoverflow.com/questions/1457735/django-models-are-not-ajax-serializable – theycallmemorty

+1

Une autre façon de retourner les données json, à partir d'un modèle ... def updates_after_t (demande, id): réponse = HttpResponse() réponse [ 'Content-type'] = "text/javascript" response.write (serializers.serialize ("JSON", TSearch.objects.filter (pk__gt = id))) retourner la réponse – ismail

2

Plutôt que de faire toutes ces choses ajax et JSON de bas niveau, pensez à utiliser le taconite plugin pour jQuery. Vous venez de faire l'appel au backend et il fait le reste. C'est bien documenté et facile à déboguer - surtout si vous utilisez Firebug avec FF.

+1

Je ne suis pas vendu sur ces choses de type "créer du xml et de la magie qui se passe". Il vaut mieux pointer quelqu'un vers backbone.js ou quelque chose de similaire. – peregrine

+0

@peregrine: Avez-vous * utilisé * jquery-taconite? Ce n'est pas de la magie, c'est juste un tas de détails irritants traités de manière propre et prévisible. Le code lui-même est très lisible, tout comme le malsup que j'ai utilisé. Je considère la taconite comme n'étant pas plus magique que d'utiliser un compilateur pour C ou un interpréteur pour Python - ils me facilitent tous les deux la vie. J'ai programmé en assembleur pendant des années et je comprends ce qui se passe jusqu'au fer nu (ou au silicium), mais ça ne me plaît pas. J'utilise jQuery pour beaucoup de choses, ce qui est un acquis pour la plupart des projets sur lesquels je travaille. –