2013-02-27 9 views
5

zurückbringt Ich stelle diese Frage mehrfach, seitdem ich keine anwendbare Hilfe empfangen habe.Wie man json Wörterbuch im django ajax Update

Mein Problem ist, dass ich nicht weiß, wie Abfrageergebnis Vorlage als Ajax-Antwort zurückgeben.

ich dies tat:

if request.path == "/sort/": 
    sortid = request.POST.get('sortid') 
    locs = Location.objects.order_by(sortid) 
    if request.is_ajax(): 
     return HttpResponse(locs,mimetype="application/json") 

dann meine Ajax done Funktion tut dies:

}).done(function(data){ 
$('.sortierennach').html(data); 
}); 

nun, was passiert, ist, dass es ersetzt nur den Inhalt von .sortierennach, es ist nicht django Rendering dic so das kann ich tun:

{% for loc in locs %} 
    {{loc.name}} 
{% endfor %} 

kann jemand ple ase mir helfen ... vielen Dank

+2

Für eine solche Sortierfunktion sollten Sie wirklich eine GET-Methode verwenden, nicht POST, da Sie keinen Inhalt auf dem Server ändern, sodass Sie in Zukunft ein ETag oder ähnliches anhängen können, um die Antwort zwischenzuspeichern. – LtWorf

Antwort

4

Sie müssen Ihre Objektliste in ein JSON-Wörterbuch exportieren.

if request.path == "/sort/": 
    sortid = request.POST.get('sortid') 
    locs = Location.objects.order_by(sortid) 
    if request.is_ajax(): 
     import json 
     return HttpResponse(json.dumps(locs), mimetype="application/json") 

Das erfordert jedoch, dass Sie eine Art von clientseitigem Vorlagensystem verwenden.

Eine bessere Möglichkeit ist, Django render_to_response Verknüpfung zu verwenden. Sie müssen nicht wirklich mit JSON antworten. Sie können die Anfrage einfach mit einer Zeichenfolge beantworten.

Ich erstelle normalerweise zwei Vorlagen für AJAX-betriebene Dinge. Die erste ist eine partielle Vorlage, die nur das spezifische HTML-Bit enthält, das ich während eines AJAX-Updates aktualisieren möchte. Der zweite ist ein Wrapper, der verwendet werden kann, wenn die Ansicht normal aufgerufen wird.

Ein billiges Beispiel, hier ist mein object_list.html:

<ul id='object-list'> 
    {% for object in object_list %} 
     <li>{{ object.value }}</li> 
    {% endfor %} 
</ul> 

Und hier ist mein base.html:

<html> 
<title>Example</title> 
    <body> 
     {% include 'object_list.html' %} 
    </body> 
</html> 

Für die Ansicht, wollen Sie, dies zu tun:

from django.shortcuts import render_to_response 
from django.template import RequestContext 

from models import Location 

def view(request): 
    locs = Location.objects.order_by(sortid) 
    if request.is_ajax(): 
     return render_to_response('object_list.html', {'object_list': locs}, context_instance=RequestContext(request)) 
    return render_to_response('base.html', {'object_list': locs}, context_instance=RequestContext(request)) 

Dadurch wird die Ansicht normalerweise über einen Standard-GET oder über eine XHTTP-Anforderung aufgerufen und gibt nur den gewünschten Teil-HTML-Code zurück aktualisieren. Praktisch!

+0

danke Mann, ich werde das jetzt versuchen .. so werde ich nur '' render_to_response'' anstelle von Json, richtig? – doniyor

+0

Yessir. Sie müssen JSON nicht verwenden, wenn Sie nur eine HTML-Zeichenfolge senden. –

+0

es funktioniert nicht – doniyor

1

Wenn Sie den Wert in Ajax-Funktion zu füllen versuchen, müssen Sie zunächst wie das queryset Objekt in das JSON-Objekt konvertieren

if request.path == "/sort/": 
    sortid = request.POST.get('sortid') 
    locs = Location.objects.order_by(sortid) 
    if request.is_ajax(): 
     locs = json.dumps(locs) 
     return HttpResponse(locs,mimetype="application/json") 

Jetzt sind Sie in Ihren Ajax-Code wird die JSON Daten erhalten.

Also mit diesen Locs Daten entweder können Sie Ihre HTML in Ajax oder was auch immer Sie tun möchten, können Sie es tun.

+0

danke, ich werde einen Schuss geben – doniyor