在ListAPIView中,我尝试重载类以呈现HTML和JSON,如下所示。对于JSON渲染,它应该为Response提供serializer.data以呈现JSON输出。对于HTML呈现,期望为dict类型和模板名称提供context_data,以便呈现HTML。
为了重用rest框架现有代码,我尝试提取rest框架已经序列化的数据并一次性重载具有序列化数据和模板名称的Response数据。结果是HTML模板未按预期呈现,因为提供的数据不在dict类型中。
class UserProfileList(generics.ListAPIView):
model = UserProfile
serializer_class = UserProfileSerializer
template_name = 'userProfile/list.html'
queryset = UserProfile.objects.all()
def list(self, request, *args, **kwargs):
response = super(generics.ListAPIView, self).list(request, *args, **kwargs)
return Response(response.data, template_name=self.template_name)
我想知道Response的扩展是用序列化器构造对象,dict类型的数据,模板作为参数,以便我们可以重用库而无需明确标识请求格式。任何提示或建议。
class UserProfileList(generics.ListAPIView):
model = UserProfile
serializer_class = UserProfileSerializer
template_name = 'userProfile/list.html'
queryset = UserProfile.objects.all()
def list(self, request, *args, **kwargs):
return Response(self.get_serilaizer(), self.get_context_data(), template_name=self.template_name)
答案 0 :(得分:1)
在您的第一个版本中,您是否尝试过打印response.data
?毫无疑问,它不是一个字典,而是某种序列化的表示。也许是一个JSON字符串。如果要将其作为模板上下文传回,则需要对其进行反序列化。
self.object_list = self.filter_queryset(self.get_queryset())
serializer = self.get_serializer(self.object_list, many=True)
return Response(serializer.data, template_name=self.template_name)