¿Hay alguna manera de pasar objetos JSON al front-end de una plantilla web si se usa el framework Django o Python en general?

Por ejemplo, si quiero enviar un objeto que tiene dos matrices como propiedades (digamos xvalues y yvalues), ¿cómo podría usar JavaScript o jQuery para hacer una llamada Ajax para obtener el objeto que tiene las propiedades?

5
locoboy 11 ago. 2011 a las 06:20

5 respuestas

La mejor respuesta

Complementando la respuesta zeekay, si desea enviar solo un objeto, puede hacer un volcado json, por ejemplo:

import json

def my_ajax_view(request):
    if not request.is_ajax():
        raise Http404

    data_dict = getmydata() #lets supose is a dict
    return HttpResponse(json.dumps(data_dict))

De esa manera, recibirá esos datos a través de su éxito ajax y hará lo que quiera con ellos.

También puede enviar listas, cuando reciba su respuesta, a veces tendrá que hacer un análisis JSON. De datos (a veces porque cuando envía un diccionario creo que no es necesario)

4
Hassek 25 feb. 2019 a las 18:39

Desafortunadamente, las respuestas actuales están un poco desactualizadas, aquí se explica cómo hacer esto con versiones más recientes de Django (incluido Django> 2.0 ):

Utilice JsonResponse , una subclase de HttpResponse, para esta:

# views.py
from django.http import JsonResponse

def get_coords(request):
    """returns json response"""
    json_data = {'xval': 10, 'yval': 10}
    return JsonResponse(json_data)

Asume un dict como parámetro, pero puede pasar cualquier serializable JSON, en principio. Te desanimaría de hacerlo, pero si pasas un objeto que no es un dict necesitas establecer el parámetro safe=False.

La solicitud ajax podría verse así:

# index.html
...
<head>
...
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
    $.get("{% url 'ajax_get_coords' %}", function(data) {
        var xval = data.xval;
        var yval = data.yval;
        ...
    });
</script>
...

Con la urlconfig correspondiente:

# urls.py

urlpatterns = [
   path('ajax_coords/', views.get_coords, name='ajax_get_coords'),
   ...
2
LeRobin 31 ene. 2019 a las 02:22

Si te entiendo correctamente, quieres renderizar algo de JSON en tu salida HTML.

Para hacer esto, pase el objeto codificado json de la vista a la plantilla:

views.py:

import json

def myview(request):
    obj = {"a": 1, "b": 2}
    return render_to_response("template.html", {"obj_as_json": json.dumps(obj)})

template.html:

<html>
    <head>
    <script type="text/javascript">
    var obj = {{ obj_as_json|safe }};
    </script>
    </head>
    ...
</html>

Se renderizará como:

...
<script type="text/javascript">
var obj = {"a": 1, "b": 2};
...

Tenga en cuenta que json.dumps solo funciona con diccionarios que contienen tipos de datos simples. Django tiene soporte para serializar objetos modelo a json, usando:

from django.core import serializers
obj_as_json = serializers.serialize("json", my_model_object)

Actualización: tenga en cuenta que necesita usar "segura" para obtener esto:

  var obj = {"items": [{"human": "Genesis", "usfm": "GEN"},],}

En lugar de esto:

  var obj = {&quot;items&quot;: [{&quot;human&quot;: &quot;Genesis&quot;, &quot;usfm&quot;: &quot;GEN&quot;},],}
4
ZF007 26 ago. 2019 a las 22:23

Claro, solo configure una vista que devuelva JSON y haga una solicitud. Aquí hay un ejemplo simple:

import json      
from django.http import HttpResponse
from django.template import Template, Context

def ajax(request):
    """returns json response"""
    return HttpResponse(json.dumps({'foo': 'bar'}), mimetype='application/json')

def index(request):
    """simple index page which uses jquery to make a single get request to /ajax, alerting the value of foo"""
    t = Template("""
    <!doctype html>
      <head>
       <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
       <script type="text/javascript">
         $.get('/ajax/', function(data) {
           alert(data['foo']);
         });
       </script>
     </head>
    </html>""")
    return HttpResponse(t.render(Context()))

# urlconf
urlpatterns = patterns('',
    (r'^$', index),
    (r'^ajax/', ajax),
)
6
zeekay 11 ago. 2011 a las 03:03

A partir de Django 2.1, hay otra forma de pasar objetos JSON al front-end incluyéndolos en la plantilla y utilizando el filtro de plantilla json_script. Esto creará una etiqueta de script en el HTML e incluirá el JSON dentro de eso. Esto es útil para incluir el JSON en la descarga de la página HTML.

Su plantilla usaría la etiqueta así:

{{ your_json_object | json_script: "element_id" }}

Donde your_json_object es una variable de plantilla que contiene un objeto que se puede analizar en JSON.

La salida HTML sería:

<script id="element_id">{['json', 'object']}</script> 

Y puede acceder a él en un archivo Javascript posterior con:

let my_json = JSON.parse(document.getElementByID('element_id').textContent)

Consulte la documentación.

0
Craig 31 oct. 2019 a las 05:30