zoukankan      html  css  js  c++  java
  • django rest_framework vue 实现用户列表分页

    django rest_framework vue 实现用户列表分页

    后端

    配置urls

    # 导入view
    from api.appview.userListView import userListView
    
    # 增加url配置
    urlpatterns = [
    
        ...
        url(r'^home/userlist/$', userListView.as_view()), # 用户列表
    ]

    编写视图

    # FileName : userListView.py
    # Author   : Adil
    # DateTime : 2019/8/2 1:46 PM
    # SoftWare : PyCharm
    
    
    from api import models
    from django.http import JsonResponse
    from rest_framework.views import APIView
    
    from api.models import User
    from api.utils.auth import Authentication
    from api.common.PageHandle import MyLimitOffsetPagination
    from rest_framework import serializers
    
    class userListView(APIView):
    
    
        authentication_classes = [Authentication]   #  添加认证
        permission_classes = []      # 不尽兴权限控制
    
        def get(self,request,*args,**kwargs):
    
            # user1 = models.User.objects.all()
            #
            # print(user1)  # <QuerySet [<User: username: wang,password: 123456>,...
    
    
    
    
            # userInfoList = models.User.objects.values()
    
    
            # print('^^^^^')
            # for userlist in userInfoList:
            #
            #     # userlist = model_to_dict(userlist)
            #     print(type(userlist))
            #     print(userlist)
    
            # print(type(userInfoList))
            # print("!!!!!")
            # userInfoList = model_to_dict(userInfoList)
            #
            # print(type(userInfoList))
    
            # print(userInfoList)   #  <QuerySet [{'id': 1, 'username': 'wang', 'password': '123456', 'age': '20', 'e_mail': '272981562@qq.com', 'user_type': 2, 'create_time': datetime.datetime(2019, 7, 30, 21, 16, 12, 301365), 'update_time': datetime.datetime(2019, 7, 30, 21, 16, 12, 301396)}, {'id': 2, ...
    
            # for userList in userInfoList:
            #     #print(userList)
    
            # users = models.User.objects.values_list()
            # print("8***")
            # print(users)  # <QuerySet [(1, 'wang', '123456', '20', '272981562@qq.com', 2, datetime.datetime(2019, 7, 30, 21, 16, 12, 301365), datetime.datetime(2019, 7, 30, 21, 16, 12, 301396)), (2, 'yang', '....
            # for user in users:
            #     print(user)
    
    
    
            userInfoList = models.User.objects.values()print(userInfoList)
    
            ret = {'code': 1000, 'msg': None, 'data': None,'lens':None}
            try:
                ret['msg'] = '成功'
                ret['data'] = list(userInfoList)
           ret['lens'] = len(userInfoList)
    except Exception as e: ret['code'] = 1001 ret['msg'] = '失败' return (JsonResponse(ret)) # return (page.get_paginated_response(roles_ser.data))
     

    至此完成后端code。

    查看接口返回

    可以看到此时返回的是查询所有结果,有21条数据。

     

    可以看到 这样返回的结果是21条数据,而不能分页展示。

    下面介绍一下分页功能

    创建分页类

    # FileName : PageHandle.py
    # Author   : Adil
    # DateTime : 2019/8/5 4:33 PM
    # SoftWare : PyCharm
    
    
    #logintest/api/common/PageHandle.py
    
    from rest_framework.pagination import LimitOffsetPagination,PageNumberPagination
    
    
    
    class MyLimitOffsetPagination(PageNumberPagination):
        # 每页显示多少个
        page_size = 3
        # 默认每页显示3个,可以通过传入pager1/?currentPage=2&pageSize=4,改变默认每页显示的个数
        page_size_query_param = "pageSize"
        # 最大页数不超过10
        max_page_size = 100
        # 获取页码数的
        page_query_param = "currentPage"
    
    # default_limit:表示默认每页显示几条数据
    # limit_query_param:表示url中本页需要显示数量参数
    # offset_query_param:表示从数据库中的第几条数据开始显示参数
    # max_limit:表示每页最大显示数量,做限制使用,避免突然大量的查询数据,数据库崩溃

    view 增加分页代码  方式一

            # 增加分页
    
            userInfoList = models.User.objects.values().order_by('id')
    
            print(userInfoList)
    
            page = MyLimitOffsetPagination()
            print(page)
            page_roles = page.paginate_queryset(queryset=userInfoList, request=request, view=self)
            print(page_roles)
            roles_ser = PagerSerializer(instance=page_roles, many=True)
            print(roles_ser.data)
            # return Response(roles_ser.data)  # 只返回数据
            # return page.get_paginated_response(roles_ser.data)  # 返回前后夜url
    
            ret = {'code': 1000, 'msg': None, 'data': None,'lens':None}
            try:
                ret['msg'] = '成功'
                ret['data'] = list(page_roles)
                print(len(page_roles))
                print(len(userInfoList))
    
                ret['lens'] = len(userInfoList)
    
            except Exception as e:
                ret['code'] = 1001
                ret['msg'] = '失败'
    
            return (JsonResponse(ret))

    这是请求相应如下

    方式二

    # userlistView.py
    
    创建类
    class PagerSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = "__all__"

     直接上代码

    # FileName : userListView.py
    # Author   : Adil
    # DateTime : 2019/8/2 1:46 PM
    # SoftWare : PyCharm
    
    
    from api import models
    from django.http import JsonResponse
    from rest_framework.views import APIView
    
    from api.models import User
    from api.utils.auth import Authentication
    from api.common.PageHandle import MyLimitOffsetPagination
    from rest_framework import serializers
    
    
    class PagerSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = "__all__"
    
    
    class userListView(APIView):
    
    
        authentication_classes = [Authentication]   #  添加认证
        permission_classes = []      # 不尽兴权限控制
    
        def get(self,request,*args,**kwargs):
    
            # user1 = models.User.objects.all()
            #
            # print(user1)  # <QuerySet [<User: username: wang,password: 123456>,...
    
    
    
    
            # userInfoList = models.User.objects.values()
    
    
            # print('^^^^^')
            # for userlist in userInfoList:
            #
            #     # userlist = model_to_dict(userlist)
            #     print(type(userlist))
            #     print(userlist)
    
            # print(type(userInfoList))
            # print("!!!!!")
            # userInfoList = model_to_dict(userInfoList)
            #
            # print(type(userInfoList))
    
            # print(userInfoList)   #  <QuerySet [{'id': 1, 'username': 'wang', 'password': '123456', 'age': '20', 'e_mail': '272981562@qq.com', 'user_type': 2, 'create_time': datetime.datetime(2019, 7, 30, 21, 16, 12, 301365), 'update_time': datetime.datetime(2019, 7, 30, 21, 16, 12, 301396)}, {'id': 2, ...
    
            # for userList in userInfoList:
            #     #print(userList)
    
            # users = models.User.objects.values_list()
            # print("8***")
            # print(users)  # <QuerySet [(1, 'wang', '123456', '20', '272981562@qq.com', 2, datetime.datetime(2019, 7, 30, 21, 16, 12, 301365), datetime.datetime(2019, 7, 30, 21, 16, 12, 301396)), (2, 'yang', '....
            # for user in users:
            #     print(user)
    
    
    
            # 增加分页
    
            userInfoList = models.User.objects.values().order_by('id')
    
            print(userInfoList)
    
            page = MyLimitOffsetPagination()
            print(page)
            page_roles = page.paginate_queryset(queryset=userInfoList, request=request, view=self)
            print(page_roles)
            roles_ser = PagerSerializer(instance=page_roles, many=True)
            print(roles_ser.data)
            # return Response(roles_ser.data)  # 只返回数据
            # return page.get_paginated_response(roles_ser.data)  # 返回前后夜url
    
            ret = {'code': 1000, 'msg': None, 'data': None,'lens':None}
            try:
                ret['msg'] = '成功'
                ret['data'] = list(page_roles)
                print(len(page_roles))
                print(len(userInfoList))
    
                ret['lens'] = len(userInfoList)
    
            except Exception as e:
                ret['code'] = 1001
                ret['msg'] = '失败'
    
                # return (JsonResponse(ret))
            return (page.get_paginated_response(roles_ser.data))

    前端

    前端预期

     添加router

    import userlist from '@/components/userlist'
    Vue.use(Router)
    
    var router =  new Router({
      routes: [
        {
          path: '/userlist',
          name: 'userlist',
          component: userlist
        },

    新建userlist.vue,里面有两种方式处理后端返回。

    <template>
    <el-container style="height: 100%; border: 1px solid #eee">
      <el-aside width="200px" style="background-color: rgb(238, 241, 246)">
        <el-menu :default-openeds="['1', '3']">
          <el-submenu index="1">
            <template slot="title"><i class="el-icon-message"></i>导航一</template>
            <el-menu-item-group>
              <template slot="title">分组一</template>
              <el-menu-item index="1-1">选项1</el-menu-item>
              <el-menu-item index="1-2">选项2</el-menu-item>
            </el-menu-item-group>
            <el-menu-item-group title="分组2">
              <el-menu-item index="1-3">选项3</el-menu-item>
            </el-menu-item-group>
            <el-submenu index="1-4">
              <template slot="title">选项4</template>
              <el-menu-item index="1-4-1">选项4-1</el-menu-item>
            </el-submenu>
          </el-submenu>
          <el-submenu index="2">
            <template slot="title"><i class="el-icon-menu"></i>导航二</template>
            <el-menu-item-group>
              <template slot="title">分组一</template>
              <el-menu-item index="2-1">选项1</el-menu-item>
              <el-menu-item index="2-2">选项2</el-menu-item>
            </el-menu-item-group>
            <el-menu-item-group title="分组2">
              <el-menu-item index="2-3">选项3</el-menu-item>
            </el-menu-item-group>
            <el-submenu index="2-4">
              <template slot="title">选项4</template>
              <el-menu-item index="2-4-1">选项4-1</el-menu-item>
            </el-submenu>
          </el-submenu>
          <el-submenu index="3">
            <template slot="title"><i class="el-icon-setting"></i>导航三</template>
            <el-menu-item-group>
              <template slot="title">分组一</template>
              <el-menu-item index="3-1">选项1</el-menu-item>
              <el-menu-item index="3-2">选项2</el-menu-item>
            </el-menu-item-group>
            <el-menu-item-group title="分组2">
              <el-menu-item index="3-3">选项3</el-menu-item>
            </el-menu-item-group>
            <el-submenu index="3-4">
              <template slot="title">选项4</template>
              <el-menu-item index="3-4-1">选项4-1</el-menu-item>
            </el-submenu>
          </el-submenu>
        </el-menu>
      </el-aside>
      
      <el-container style="padding-bottom: 15px">
        <el-header style="text-align: right; font-size: 12px">
          <el-dropdown>
            <i class="el-icon-setting" style="margin-right: 15px"></i>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item>退出</el-dropdown-item>
              <!-- <el-dropdown-item>新增</el-dropdown-item>
              <el-dropdown-item>删除</el-dropdown-item> -->
            </el-dropdown-menu>
          </el-dropdown>
          <span>Adil</span>
        </el-header>
        
        <el-main>
          <el-table :data="tableData">
            <el-table-column prop="create_time" label="日期" width="140">
            </el-table-column>
            <el-table-column prop="username" label="姓名" width="120">
            </el-table-column>
            <el-table-column prop="username" label="地址">
            </el-table-column>
          </el-table>
        </el-main>
             <el-pagination
             background
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="currentPage"
          :page-sizes="[10, 20, 30, 50]"
          :page-size="pageSize"
          layout=" sizes, prev, pager, next, jumper"
          :total="total">
        </el-pagination>
    
      </el-container>
    </el-container>
    
    </template>
    
    
    <style>
      .el-header {
        background-color: #B3C0D1;
        color: #333;
        line-height: 60px;
      }
      
      .el-aside {
        color: #333;
      }
    </style>
    
    <script>
    import axios from 'axios';
      export default {
        data() {
          return {
            tableData: [],
            total: 0,
            currentPage: 1,
            pageSize: 10
          }
        },
        created(){
            this.getUserList()
        },
        methods:{
            handleSizeChange(size) {
                this.pageSize = size;
                this.getUserList();
            },
            handleCurrentChange(current) {
                this.currentPage = current;
                this.getUserList();
            },
            getUserList(){
                const token = localStorage.getItem('token');
                axios.get(`/home/userlist/?token=${token}`,
                {headers:{token:localStorage.getItem('token')},
                    params: {
                        currentPage: this.currentPage,
                        pageSize: this.pageSize
                    }
                }).then((res)=>
            {
                // 后台方式一
                // const data = res.data
                // this.tableData = data.data;
                // this.total = data.lens;
    
                // 后台方式二
                const data = res.data
                this.tableData = data.results;
                this.total = data.count;
    
            console.log(res.data);
            // if (res.data.code===1000){
            // //   localStorage.setItem('token',res.data.token);
            // //     this.$router.push({path:'/userlist'});
            // }
            });
            }
            }
    
    
    // getUserList(){
    //             axios.get('/home/userlist/').then((res)=>
    //         {
    //         console.log(res);
    //         // if (res.data.code===1000){
    //         // //   localStorage.setItem('token',res.data.token);
    //         // //     this.$router.push({path:'/userlist'});
    //         // }
    //         });
    //         }
    //         }
    
    
      }
    </script>

    方式二的返回结果如下

  • 相关阅读:
    【NOIP2013】花匠
    【DP合集】tree-knapsack
    【DP合集】m-knapsack
    【DP合集】背包 bound
    【DP合集】合并 union
    【DP合集】棋盘 chess
    BZOJ1026 [SCOI2009]windy数
    最长上升子序列 LIS nlogn
    再谈线性基
    数论问题算法模板
  • 原文地址:https://www.cnblogs.com/BlueSkyyj/p/11307904.html
Copyright © 2011-2022 走看看