1

在 ListAPIView 中,我尝试重载类以呈现 HTML 和 JSON,如下所示。对于 JSON 渲染,期望为 Response 提供 serializer.data 来渲染 JSON 输出。对于 HTML 渲染,需要提供 dict 类型的 context_data 和模板名称,以便 Response 渲染 HTML。

为了重用 REST 框架现有代码,我尝试提取 REST 框架已经序列化的数据,并一次性使用序列化数据和模板名称重载响应数据。结果是 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)
4

1 回答 1

1

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

根据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)
于 2014-01-20T02:21:41.963 回答