使用Django将JSON数据传递到前端

时间:2011-08-11 02:20:54

标签: python django json sqlite

如果使用Django框架或Python,有没有办法将JSON对象传递到Web模板的前端?

例如,如果我想发送一个具有两个数组作为属性的对象(假设为xvaluesyvalues),我将如何使用JavaScript或jQuery进行Ajax调用获取具有属性的对象?

5 个答案:

答案 0 :(得分:6)

当然,只需设置一个返回JSON并向其发出请求的视图。这是一个简单的例子:

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

答案 1 :(得分:4)

补充zeekay的答案,如果你只想发送一个对象,你可以做一个json转储,例如:

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

这样你就可以通过你的ajax成功获得这些数据并随心所欲地做任何事情。

您也可以通过列表发送,当您收到回复时,有时您需要对数据执行JSON.parse(有时会导致您发送字典时我认为没有必要)

答案 2 :(得分:4)

如果我理解正确,您希望在HTML输出中呈现一些JSON。

为此,将json编码的对象从视图传递到模板:

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 }};
    </script>
    </head>
    ...
</html>

将呈现为:

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

请注意,json.dumps仅适用于包含简单数据类型的字典。 Django支持将模型对象序列化为json,使用:

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

答案 3 :(得分:1)

不幸的是,目前的答案有点过时了,这是在更新版本的Django(包括 Django> 2.0 )上执行此操作的方法:

为此使用JsonResponse的子类HttpResponse

# views.py
from django.http import JsonResponse

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

它假定一个dict作为参数,但是原则上您可以传递任何可序列化的JSON。我不鼓励您这样做,但是如果传递的对象不是dict,则需要设置参数safe=False

ajax请求可能类似于:

# 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>
...

使用相应的urlconfig:

# urls.py

urlpatterns = [
   path('ajax_coords/', views.get_coords, name='ajax_get_coords'),
   ...

答案 4 :(得分:0)

从Django 2.1开始,还有另一种方法将JSON对象传递到前端,方法是将它们包含在模板中,并使用json_script模板过滤器。这将在HTML中创建一个脚本标签,并在其中包含JSON。对于将JSON包含在HTML页面的下载中,这很有用。

您的模板将使用如下标记:

{{ your_json_object | json_script: "element_id" }}

your_json_object是一个模板变量,其中包含可以解析为JSON的对象。

HTML输出为:

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

您可以使用以下更高版本的Javascript文件访问它:

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

检出documentation