如果使用Django框架或Python,有没有办法将JSON对象传递到Web模板的前端?
例如,如果我想发送一个具有两个数组作为属性的对象(假设为xvalues
和yvalues
),我将如何使用JavaScript或jQuery进行Ajax调用获取具有属性的对象?
答案 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)