2013-02-27 15 views
5

sto facendo questa domanda più volte poiché non ho ricevuto alcun aiuto applicabile.Come restituire dizionario json in django update

il mio problema è che non so come restituire il risultato della query al modello come una risposta ajax.

ho fatto questo:

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") 

poi la mia funzione ajax done fa questo:

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

ciò che ora accade è che solo sostituisce il contenuto di .sortierennach, non sta rendendo django dic così che posso fare questo:

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

può qualcuno ple ase aiutami ... grazie mille

+2

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

risposta

4

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

+0

grazie amico, proverò questo ora .. quindi userò semplicemente '' render_to_response'' invece di json, giusto? – doniyor

+0

Yessir. Non è necessario utilizzare JSON se si sta inviando semplicemente una stringa HTML. –

+0

non funziona – doniyor

1

Se si sta tentando di popolare il valore della funzione ajax prima è necessario convertire l'oggetto set di query in un oggetto JSON come

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") 

Ora nel codice Ajax si riceverà i dati JSON.

Quindi, utilizzando i dati di questa posizione è possibile generare il proprio html in Ajax o qualsiasi altra cosa si desideri fare.

+0

grazie, darò uno scatto – doniyor