Django:DRF框架渲染模版

DRF官方文档渲染器传送门 --写在最后怕看不到

原始方法:

后端使用drf写好接口后,前端页面仍采用视图函数方式跳转至html页面

 

 

 优化:

  1、不用写视图函数

  2、修改路由为   url(r'^server_list$', server_info.ServerInfoList.as_view()),

  3、修改类视图

 

  实际drf基于类的视图(CBV模式)是可以直接渲染模版的,只需要加上renderer_classes 和 template_name 

from rest_framework import generics, serializers, renderers
from ..models import ServerInfo
from rest_framework.response import Response

class ServerInfoList(generics.ListAPIView):
    """
    获取所有服务器信息
    """
    queryset = ServerInfo.objects.all()
    serializer_class = ServerInfoSerializers
    # 渲染页面
    renderer_classes = (renderers.TemplateHTMLRenderer, renderers.JSONRenderer)
    template_name = 'server_list.html'

    # 重写ListModelMixin中的list方法修改返回体格式为{"total": 2,"rows": [{},{}]},以便前端使用(server分页模式)

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response({"rows": serializer.data, "total": ServerInfo.objects.count()})
        # return Response(serializer.data)

添加上面两个属性后,还必须重写对应的返回数据的方法,此处子类视图ListAPIView对应的返回数据方法为list,

如不重写直接返回 return Response(serializer.data),默认数据格式为list类型[{},{}]则会报错 context must be a dict rather than ReturnList.

所以必须修改返回为dict类型,刚好结合前端框架需要的数据格式略作修改

重写list根本原因:

  如果返回需要渲染模版,则最终都会调用Python27\lib\site-packages\django\template\context.py模块的make_context方法,此方法要求上下文必须为dict

 

posted @ 2020-10-13 20:43  秋寻草  阅读(662)  评论(0)    收藏  举报