用于呈现JSON和HTML的通用视图

时间:2013-06-26 09:49:19

标签: django-rest-framework

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

1 个答案:

答案 0 :(得分:1)

在您的第一个版本中,您是否尝试过打印response.data?毫无疑问,它不是一个字典,而是某种序列化的表示。也许是一个JSON字符串。如果要将其作为模板上下文传回,则需要对其进行反序列化。

根据code in the ListModelMixin

,您可能需要这样的内容
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)