Tengo algo así en views.py:
return JsonResponse({'foo': 'bar'})¿Cómo mostraría "barra" en la plantilla? Algo como:
<h1 id="demo"></h1> <script> document.getElementById("demo").innerHTML = ?JsonResponse?; </script>o podría hacerse con respuesta http?
return HttpResponse("Bar")y HTML:
<h1 id="demo"></h1> <script> document.getElementById("demo").innerHTML = ?HttpResponse?; </script>Está bien. Supongamos que tiene una url /yourURL conectada a una función de vista. Llamemos a esta función índice:
from django.shortcuts import render def index(request): data = {foo:'bar'} render(request,'path/to/yourTemplate.html',data) Uso render como atajo. En yourTemplate.html, puede acceder a los datos como {{foo}} en cualquier lugar. Para enviar objetos json a la plantilla sin renderizar, considere la siguiente plantilla (yourTemplate.html):
<div id='initialData'>{{foo}}</div> <div id='jsondata'></div> Necesita una nueva vista y una solicitud ajax para obtener información de ella. Puede hacer esto en la misma vista de índice, o puede crear una nueva URL y una vista asociada. Usemos la segunda opción. Es así, construyes una nueva URL /yourURL/download conectada a una vista de download (views.py):
def download(request): data = {foo2:'bar2'} JsonResponse(data)Luego, necesita una solicitud ajax para llamar a esta vista y escribir la respuesta en el div en caso de éxito (yourTemplate.html):
<script> $.ajax({ url: "/yourURL/download", type: 'get', success: function (data) { alert("Success"); var div = document.getElementById('jsondata'); div.innerHTML = div.innerHTML + data.foo; } }); </script>¡Voila! Tendrá tanto bar como bar2 en su pantalla. Para obtener más detalles, necesita un botón asociado con la llamada ajax, para que pueda ver que la página en realidad no se vuelve a mostrar con JsonResponse.