Musisz wyeksportować listę obiektów do słownika JSON.
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")
Wymaga to jednak użycia jakiegoś systemu szablonów po stronie klienta.
Lepszym sposobem jest użycie skrótu Django o numerze render_to_response
. Nie musisz "reagować" na JSON. Możesz po prostu odpowiedzieć na żądanie ciągiem.
Zazwyczaj tworzę dwa szablony dla rzeczy napędzanych AJAX. Pierwszy to częściowy szablon, który zawiera tylko określony bit HTML, który chciałbym zaktualizować podczas aktualizacji AJAX. Druga to opakowanie, które może być używane, gdy widok jest wywoływany normalnie.
Tani przykład, oto moja object_list.html:
<ul id='object-list'>
{% for object in object_list %}
<li>{{ object.value }}</li>
{% endfor %}
</ul>
A oto moja base.html:
<html>
<title>Example</title>
<body>
{% include 'object_list.html' %}
</body>
</html>
Do widzenia, będziemy chcieli, aby to zrobić:
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))
To pozwala na wywołanie widoku normalnie, za pośrednictwem standardowego GET lub przez żądanie XHTTP, zwracając tylko częściowy kod HTML, który chcesz aktualizacja. Poręczny!
W przypadku funkcji sortowania tego typu, należy naprawdę użyć metody GET, a nie POST, ponieważ nie modyfikuje się żadnej zawartości na serwerze, więc w przyszłości można dołączyć moduł ETag lub podobny do buforowania odpowiedzi. – LtWorf