博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue + Django2.0.6 学习笔记 5.6 通过GenericView方式实现商品列表页和分页功能
阅读量:4127 次
发布时间:2019-05-25

本文共 2270 字,大约阅读时间需要 7 分钟。

1. 先说 GenericView:

之前get请求的处理是这么写的:

def get(self, request, format=None):        goods = Goods.objects.all()[:10]        # 因为goods是一个queryset列表对象 所以需要Many=True        goods_serializer = GoodSerializer(goods, many=True)        return Response(goods_serializer.data)

嗯。。。感觉代码太长了

那就改:

from rest_framework import mixinsfrom rest_framework import genericsclass GoodsListView(mixins.ListModelMixin, generics.GenericAPIView):    """    商品列表页.    """    queryset = Goods.objects.all()[:10]    serializer_class = GoodsSerializer# 必须重写 否则认为不接受get请求 其他的请求也是    def get(self, request, *args, **kwargs):        return self.list(request, *args, **kwargs)

嗯。。。能不能不重写那个get函数

能!

先看源码:

rest_framework.generics.ListAPIViewclass ListAPIView(mixins.ListModelMixin, GenericAPIView):    """    Concrete view for listing a queryset.    """    def get(self, request, *args, **kwargs):        return self.list(request, *args, **kwargs)

很像有没有

那就这样干:

from rest_framework import genericsclass GoodsListView(generics.ListAPIView):    """    商品列表页.    """    queryset = Goods.objects.all()[:10]    serializer_class = GoodsSerializer    pagination_class = GoodsPagination

好了。 这样就可以了 屌爆了有没有

那现在来说第二个功能:

分页

还要手动分页么? NONONO~~

这样来:

首先先去settings.py中设置下

REST_FRAMEWORK = {    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',    'PAGE_SIZE': 10}

然后。。就可以了。  屌不屌 屌不屌

效果:

当然 这都是默认分页

如果要定制化的话可以这样:

先把settings.py中的那个设置注释掉page_size的字段

class GoodsPagination(PageNumberPagination):    # 每页显示列数    page_size = 10    # 默认每页显示10个, 可以传入?page_size来改变每页的个数    page_size_query_param = 'page_size'    # 获取页码数的字段名    page_query_param = 'p'    # 每页最大显示列表数量    max_page_size = 100
class GoodsListView(generics.ListAPIView):    """    商品列表页.    """    # queryset = Goods.objects.all()[:10]    # 所有的数据 做分页用    queryset = Goods.objects.all().order_by('id')    serializer_class = GoodsSerializer# 这里要传递类过来    pagination_class = GoodsPagination

然后就可以了 

这里要注意的是 Django2.0的rest_framework(3.9.2)中的settings.py中的'DEFAULT_PAGINATION_CLASS'的值是None

所以需要在settings.py中自定义添加上去。

还有在使用Goods.objects.all()后进行序列化。有可能会报错Pagination may yield inconsistent results with an unordered object_list

这表示 获取的QuerySet对象列表的数据是无序。所序列化的数据顺序是不确定的。这时候就需要给他做个排序。比如:

Goods.objects.all().order_by('id');

这样就不会报错了

分页的具体样式设计可以操作官方文档:

完结  drf屌爆了 

转载地址:http://znepi.baihongyu.com/

你可能感兴趣的文章
Spring框架的ImportSelector到底可以干嘛
查看>>
Mysql中下划线问题
查看>>
微信小程序中使用npm过程中提示:npm WARN saveError ENOENT: no such file or directory
查看>>
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
idea的安装以及简单使用
查看>>
Windows mysql 安装
查看>>
python循环语句与C语言的区别
查看>>
Vue项目中使用img图片和background背景图的使用方法
查看>>
vue 项目中图片选择路径位置static 或 assets区别
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
facebook库runtime.js
查看>>
vue2.* 中 使用socket.io
查看>>
openlayers安装引用
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>