È necessario esportare l'elenco degli oggetti in un dizionario 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")
Tuttavia, ciò richiederà che si utilizzi un tipo di sistema di modello sul lato client.
Un modo migliore è utilizzare la scorciatoia di Django render_to_response
. In realtà non hai "bisogno" di rispondere con JSON. Puoi solo rispondere alla richiesta con una stringa.
Generalmente creo due modelli per le cose con alimentazione AJAX. Il primo è un modello parziale, che contiene solo il bit specifico di HTML che vorrei aggiornare durante l'aggiornamento di AJAX. Il secondo è un wrapper, che può essere usato quando la vista viene chiamata normalmente.
Un esempio di buon mercato, ecco la mia object_list.html:
<ul id='object-list'>
{% for object in object_list %}
<li>{{ object.value }}</li>
{% endfor %}
</ul>
Ed ecco la mia base.html:
<html>
<title>Example</title>
<body>
{% include 'object_list.html' %}
</body>
</html>
per la vista, si vorrà fare questo:
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))
Questa vista viene chiamata normalmente, tramite un GET standard o tramite una richiesta XHTTP, restituendo solo l'HTML parziale che si desidera aggiornare. Maneggevole!
Per una funzione di ordinamento di questo tipo, è necessario utilizzare un metodo GET, non POST, poiché non si modifica alcun contenuto sul server, quindi in futuro è possibile allegare un ETag o simile per memorizzare la risposta nella cache. – LtWorf