【问题标题】:Generic View for Rendering JSON and HTML用于呈现 JSON 和 HTML 的通用视图
【发布时间】:2013-06-23 09:34:48
【问题描述】:

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

【问题讨论】:

  • 你解决了吗?

标签: django-rest-framework


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2019-07-27
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多