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根本原因:
如果返回需要渲染模版,则最终都会调用Python27libsite-packagesdjango emplatecontext.py模块的make_context方法,此方法要求上下文必须为dict