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