Django rest序列化-将JSON传递给Javascript

时间:2018-08-19 11:23:04

标签: django django-rest-framework

免责声明-Django noob,尤其是REST Framework。我正在尝试创建一个为此目的将JSON传递到模板的应用程序。我认为Django Rest将是理想的选择。

我已经设置了一个用户配置文件,以便用户可以选择各种属性(可以正常工作),现在希望将所有用户选择的JSON传递给模板。将其视为“我的个人资料”页面。

查看:

        profile = Profile.objects.filter(user=request.user)
        serializer = ProfileSerializer(profile, many=True)
        myteam = JsonResponse(serializer.data, safe=False)

        print(myteam.content) ## to see what's being passed

        context = {'myteam': myteam.content}

        return render(request, 'main/myteam.html', context)

模板:

<script>
console.log({{myteam}});
<\script>

Django服务器输出:

b'[{"user": "DAVE", "GK1": {"id": 1001, "ShortName": "J. Strummer", "Club": "CLUB", "Shirt": "SHIRT.png", "ShortClub": "ETC", "ShortPos": "FW", "CurrentVal": "10", "TotalPoints": 1}, "GK2": {"id": 320, "ShortName": "D. Jones", "Club": "CLUB2", "Shirt": "ETABE.png", "ShortClub": "ETABE", "ShortPos": "GK", "CurrentVal": "4.5", 

模板-Google Chrome JS控制台:

Uncaught SyntaxError: Invalid or unexpected token

模板-Chrome详细信息:

console.log(b&#39;[{&quot;user&quot;: &quot;mikey&quot;, &quot;GK1&quot;: {&quot;id&quot;: 1001, &quot;ShortName&quot;: &quot;J. Strummer&quot;, &quot;Club&quot;: &quot;ETC&quot;, &quot;Shirt&quot;: &quot;SHIRT.png&quot;, &quot;ShortClub&quot;: &quot;ETC&quot;, &quot;ShortPos&quot;: &quot;FW&quot;, &quot;CurrentVal&quot;: &quot;10.0&quot;, &quot;TotalPoints&quot;: 1},  // lot's more of this

新手结论:

我似乎没有从服务器传递到模板的“干净” JSON对象。可能由于b'[....这个字节是文字上的吗?

也许我应该使用另一种方法将JSON传递给模板?

TWIST-在测试中,我遵循REST教程,并能够设置一个简单的视图,该视图返回了 JsonResponse:

player = Player.objects.all()
serializer = PlayerSerializer(player, many=True)
return JsonResponse(serializer.data, safe=False)

现在,如果您转到此URL映射,它将在浏览器中显示一个完美的JSON示例。我不明白为什么

之间应该有区别
myteam = JsonResponse(serializer.data, safe=False)

return JsonResponse(serializer.data, safe=False)

从现在开始我已经坚持了好几天,所以任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我相信您可能需要这样做:

    from rest_framework.renderers import JSONRenderer

    profile = Profile.objects.filter(user=request.user)

    serializer = ProfileSerializer(profile, many=True)

    content = JSONRenderer().render(serializer.data)

    return JsonResponse(content)

或者这个:

    from rest_framework.renderers import JSONRenderer

    profile = Profile.objects.filter(user=request.user)

    serializer = ProfileSerializer(profile, many=True)

    return JsonResponse(serializer.data)

而不是创建JsonResponse对象并将其通过上下文传递回去。

但是,上述方法还有另一种选择,因为您希望端点非常灵活。

3rd-party package提供了此类API查询功能。我经常使用它,发现它确实很好用:

pip install djangorestframework-queryfields

像这样声明您的序列化器:

from rest_framework.serializers import ModelSerializer
from drf_queryfields import QueryFieldsMixin

class MyModelSerializer(QueryFieldsMixin, ModelSerializer):
    ...

然后可以使用查询参数在客户端指定字段:

GET /identities/?fields=id,data

排除过滤也是可能的,例如返回除 id外的每个字段:

GET /identities/?fields!=id

答案 1 :(得分:1)

这里发生了一些事情。

首先,您获取了响应的渲染输出,并将内容传递回模板中。这不是正确的选择。您应该完全跳过JsonResponse并将String var1 = BuildConfig.devProperty["Variable1"];传递到渲染器,然后再将其发送到模板。

serializer.data

第二,编码是由于Django模板的自动HTML转义。您应该将JSON标记为安全。

    serializer = ProfileSerializer(profile, many=True)
    data = JSONRenderer().render(serializer.data)
    context = {'myteam': data}
    return render(request, 'main/myteam.html', context)