免责声明-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'[{"user": "mikey", "GK1": {"id": 1001, "ShortName": "J. Strummer", "Club": "ETC", "Shirt": "SHIRT.png", "ShortClub": "ETC", "ShortPos": "FW", "CurrentVal": "10.0", "TotalPoints": 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)
从现在开始我已经坚持了好几天,所以任何帮助将不胜感激。
答案 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)