2013-02-27 10 views
5

Zadaję to pytanie wiele razy, ponieważ nie otrzymałem żadnej odpowiedniej pomocy.Jak przywrócić słownik json w aktualizacji ajax django

moim problemem jest to, że nie wiem jak zwrócić wynik zapytania do szablonu jako odpowiedź ajax.

zrobiłem tak:

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

wtedy mój ajax done funkcja robi to:

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

co teraz się dzieje, jest to, że po prostu zastępuje treść .sortierennach, nie jest renderowania Django DIC tak mogę to zrobić:

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

Czy ktoś może ASE mi pomóc ... Dzięki dużo

+2

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

Odpowiedz

4

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!

+0

dzięki człowieku, spróbuję to teraz .. więc po prostu użyję '' render_to_response'' zamiast json, prawda? – doniyor

+0

Yessir. Nie musisz używać JSON, jeśli właśnie wysyłasz ciąg znaków HTML. –

+0

to nie działa – doniyor

1

Jeśli próbują zapełnić wartość w funkcji ajax najpierw trzeba konwertować obiekt queryset do obiektu json jak

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

Teraz w kodzie ajax ty otrzyma dane json.

Dzięki tym danym locs możesz wygenerować swój html w Ajax lub cokolwiek chcesz zrobić, możesz to zrobić.

+0

dziękuję, dam shot – doniyor

Powiązane problemy