django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例


Posted in Python onMay 12, 2020

1、首先,界面上有个按钮触发操作:

<button type="button" class="layui-btn layui-btn-normal" id="user_list">用户列表</button>

2、点击这个按钮触发之后,会弹出一个对话框并请求view,从数据库中得到数据并产生动态表格,

其中script代码如下:

<script>
 layui.use(['table'],
  function () {
   var table = layui.table
 
   $("#user_list").click(function(){
    layer.open({
      type: 1,
      title: '用户信息',
      area: ['800px', '600px'], //宽高
      content: '<div class="layui-card-header"><div class="layui-form-text">用户信息列表</div>' +
      '</div><div class="layui-form-item">' +
      '<table id="user_table" lay-filter="user_table"></table></div>',
      success: function () {
       table.render({
        elem: '#user_table',
        id: 'user_table',
        height: 480,
        method: 'post', //接口http请求类型,默认:get
        url: '{% url 'user:user_list' %}',
        request: {
         pageName: 'page', //页码的参数名称,默认:page
         limitName: 'limit', //每页数据量的参数名,默认:limit
        },
        response: {
         statusName: 'code', //规定数据状态的字段名称,默认:code
         statusCode: 0, //规定成功的状态码,默认:0
         msgName: 'msg', //规定状态信息的字段名称,默认:msg
         countName: 'count', //规定数据总数的字段名称,默认:count
         dataName: 'data', //规定数据列表的字段名称,默认:data
        },
        page: true, //是否分页
        limit: 10, //每页显示的条数
        limits: [10, 20, 30], //每页条数的选择项,默认:[10,20,30,40,50,60,70,80,90]。
        cols: [
         [
          {
           field: 'username', //字段名
           title: '用户名', //标题
           width: 150,
           sort: true, //是否允许排序 默认:false
           fixed: 'left' //固定列
          }, {
          field: 'sex', //字段名
          title: '性别', //标题
          width: 100,
          sort: true //是否允许排序 默认:false
          //fixed: 'left' //固定列
         }, {
          field: 'age', //字段名
          title: '年龄', //标题
          width: 100,
          sort: true //是否允许排序 默认:false
          //fixed: 'left' //固定列
         }, {
          field: 'mobile', //字段名
          title: '手机', //标题
          width: 100,
          sort: true //是否允许排序 默认:false
          //fixed: 'left' //固定列
         }, {
          field: 'address', //字段名
          title: '地址', //标题
          width: 150,
          sort: true //是否允许排序 默认:false
          //fixed: 'left' //固定列
         },{
          field: '', //字段名
          title: '操作', //标题
          toolbar: '#bar'
         }
         ]
        ],
       });
      },
      cancel: function () {
       layer.closeAll();
      }
     })
   });
  });
 
</script>
 
<script type="text/html" id="bar">
 <button class="layui-btn layui-btn-normal">查看</button>
 <button class="layui-btn layui-btn-normal">编辑</button>
</script>

3、接着,所请求的view的方法,即为上面定义的url属性,{% url 'user:user_list' %},其中url配置,以及逻辑实现代码分别如下:

from django.urls import path
 
urlpatterns = [
 # 查询用户列表
 path('user_list/', UserQuery.as_view(), name="user_list"),
]
from apps.user.models.user_model import UserInfo
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
 
class UserQuery(View):
 """
 用户信息查询
 """
 def post(self, request):
  user_list = UserInfo.objects.objects.get_queryset().order_by('id')
  data = dict()
  data_items = []
  for item in user_list :
   user_dict = {"username": item.username, "age": item.age, "sex": item.sex, "mobile": item.mobile,
       "address": item.address}
   data_items.append(user_dict )
  data.__setitem__("data", data_items)
  data.__setitem__("code", 0)
  data.__setitem__("msg", "")
  data.__setitem__("count", len(field_list))
  return JsonResponse(data)
 
 @csrf_exempt
 def dispatch(self, *args, **kwargs):
  return super(UserQuery, self).dispatch(*args, **kwargs)

注:

(1)、通过查询UserInfo model底下的数据,然后分别循环这个列表,把动态表格所需要显示的值,填充到一个字典底下,并追加进列表当中,最后再统一构成一个字典data,把列表数据,状态码,返回信息,数量返回回去。

(2)其中通过ajax请求时,可能会有csrf跨域的限制,因为我们没有构造一个表单,并在表单底下加个 {% csrf_token %} ,导致请求不过去,所以要加个@csrf_exempt注解方式来解决。

补充知识:django数据接口与layUI框架数据表格结合:数据渲染和真实分页

第一步 :

通过查询数据转化为layui的数据接口模式

{“code”: 0, “msg”: “”, “count”:总数, “data”: 查询的数据}

自行定义访问路径,当url访问 xxxx/tasks/data/ 路径时:访问视图response_data,将数据传到前端,通过html可查看相关代码

视图函数views.py

import json
def response_data(request):
 dates=AssetInfo.objects.all()#自行创建测试数据。
 dataCount = dates.count()#数据总数
 lis=[]
 for i in dates:
  dict={}
  dict['jobname']=i.jobname#与前端一一对应,自行设置要展示的字段
  dict['Departments'] = i.Departments.lm_unit#外键字段
  dict['groups'] = i.groups.variables_name#外键字段
  dict['email'] = i.email
  dict['status'] = i.status
  dict['taskNo'] = i.taskNo
  dict['create_time'] = i.create_time
  lis.append(dict)
 pageIndex = request.GET.get('page') #前台传的值,
 pageSize = request.GET.get('limit') #前台传的值
 pageInator = Paginator(lis, pageSize)#导入分页模块分页操作,不写前端只展示一页数据,
 contacts = pageInator.page(pageIndex)#导入分页模块分页操作,不写前端只展示一页数据,
 res=[]
 for i in contacts:
  res.append(i)
 print(res)
 Result = {"code": 0, "msg": "", "count":dataCount, "data": res}
 # json.dumps(Result, cls=DateEncoder)没有时间字段问题可直接返回此代码。有就返回下面代码
 return HttpResponse(json.dumps(Result, cls=DateEncoder), content_type="application/json")

#解决时间字段json问题
class DateEncoder(json.JSONEncoder):
 def default(self, obj):
  if isinstance(obj,datetime.datetime):
   return obj.strftime("%Y-%m-%d %H:%M:%S")
  else:
   return json.JSONEncoder.default(self,obj)

html代码

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>Layui</title>
 <meta name="renderer" content="webkit">
 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
 <link rel="stylesheet" href="/static/layui-v2.5.5/layui/css/layui.css" rel="external nofollow" media="all">
 <!-- 注意:如果你直接复制所有代码到本地,上述css路径需要改成你本地的 -->
</head>
<body>

<table class="layui-hide" id="test"></table>

<script src="/static/layui-v2.5.5/layui/layui.js" charset="utf-8"></script>
<!-- 注意:如果你直接复制所有代码到本地,上述js路径需要改成你本地的 -->

<script>
layui.use('table', function(){
 var table = layui.table;

 table.render({
 elem: '#test'
 ,url:'/tasks/data/'#数据接口
  ,page: true
  ,limit:5
  ,limits:[5,15,20]
 ,cols: [[
 {field: 'jobname', title: '任务名'}
   , {field: 'Departments', title: '部门'}
   , {field: 'groups', title: '配置'}
   , {field: 'email', title: '邮箱'}
   , {field: 'status', title: '状态'}
   , {field: 'taskNo', title: '队列状态' }
   , {field: 'create_time', title: '创建时间'}
 ]]

 });
});
</script>

</body>
</html>

效果图

django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例

以上这篇django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python Trie树实现字典排序
Mar 28 Python
Python之eval()函数危险性浅析
Jul 03 Python
python生成日历实例解析
Aug 21 Python
栈和队列数据结构的基本概念及其相关的Python实现
Aug 24 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
pandas通过索引进行排序的示例
Nov 16 Python
Django异步任务之Celery的基本使用
Mar 23 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
详解python列表(list)的使用技巧及高级操作
Aug 15 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
Python笔记之代理模式
Nov 20 Python
浅析Django接口版本控制
Jun 26 Python
Python爬取阿拉丁统计信息过程图解
May 12 #Python
PyPDF2读取PDF文件内容保存到本地TXT实例
May 12 #Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 #Python
小 200 行 Python 代码制作一个换脸程序
May 12 #Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 #Python
Python如何根据时间序列数据作图
May 12 #Python
python logging.info在终端没输出的解决
May 12 #Python
You might like
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
Javascript面向对象之四 继承
2011/02/08 Javascript
jQuery AjaxQueue改进步骤
2011/10/06 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
2013/09/29 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
javascript中数组方法汇总
2015/07/07 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
jQuery中Find选择器用法示例
2016/09/21 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
2020/12/05 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
python解析含有重复key的json方法
2019/01/22 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
Python实现密码薄文件读写操作
2019/12/16 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
城建学院毕业生自荐信
2014/01/31 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript