优秀的编程知识分享平台

网站首页 > 技术文章 正文

Django实现树形表格(django 树形菜单)

nanyue 2024-07-26 15:48:23 技术文章 14 ℃
# Create your views here.
def menu_list(request):
    result = []
    query = Menu.objects.filter(is_delete=0)
    if not query:
        return None
    if query:
        for item in query:
            data = {
                'id': item.id,
                'name': item.name,
                'icon': item.icon,
                'url': item.url,
                'pid': item.pid,
                'type': item.type,
                'permission': item.permission,
                'status': item.status,
                'sort': item.sort,
                'note': item.note,
                'create_time': str(item.create_time.strftime('%Y-%m-%d %H:%M:%S')) if item.create_time else None,
                'update_time': str(item.update_time.strftime('%Y-%m-%d %H:%M:%S')) if item.update_time else None,
            }
            result.append(data)
            row_dict = json.dumps(result)
            # print(row_dict)
            form = MenuForm()
            content = {
                "result": row_dict,
                "form": form
            }

    return render(request, "menu/index.html", content)
前端代码
{% extends 'public/layout.html' %}
{% load static %}
{% load my_tag %}
{% block css %}
    <style>
        .breadcrumb {
            font-size: 20px;
            background: #ffffff;
        }
    </style>
    <link href="{% static 'css/bootstrap-table.min.css' %}" rel="stylesheet">
    <link rel="stylesheet" href="{% static  'css/jquery.treegrid.min.css' %}">
    <link rel="stylesheet" href="https://cdn.bootcss.com/jquery-treegrid/0.2.0/css/jquery.treegrid.min.css">
{% endblock %}
{% block content %}
    <div class="container-fluid">
        <div class="card">
            <div class="card-header">
                <ol class="breadcrumb">
                    <li class="breadcrumb-item"><a href="#" _msttexthash="2136498" _msthash="133">家</a></li>
                    <li class="breadcrumb-item active" _msttexthash="8592324" _msthash="134">仪表板 v1</li>
                </ol>
            </div>
            <div class="card-toolbar clearfix">
                <form class="pull-right search-bar" method="get" action="#!" role="form">
                    <div class="input-group">
                        <div class="input-group-btn">
                            <input type="hidden" name="search_field" id="search-field" value="title">
                            <button class="btn btn-default dropdown-toggle" id="search-btn" data-toggle="dropdown"
                                    type="button" aria-haspopup="true" aria-expanded="false">
                                标题 <span class="caret"></span>
                            </button>
                            <ul class="dropdown-menu">
                                <li><a tabindex="-1" href="javascript:void(0)" data-field="title">菜单名称:</a></li>
                            </ul>
                        </div>
                        <input type="text" class="form-control" value="" name="keyword" placeholder="请输入名称">
                    </div>
                </form>
                <div class="toolbar-btn-action">
                    <a class="btn btn-primary m-r-5" href="#!" id="doAdd"><i class="mdi mdi-plus"></i> 新增</a>
                    <a class="btn btn-danger" href="#!" id="doDel"><i class="mdi mdi-window-close"></i> 删除</a>
                </div>
            </div>
            <div class="card-body">
                <div class="table-responsive">
                    <table class="table table-bordered" id="table">

                    </table>
                </div>
                <ul class="pagination">
                    <li class="disabled"><span>?</span></li>
                    <li class="active"><span>1</span></li>
                    <li><a href="#1">2</a></li>
                    <li><a href="#1">3</a></li>
                    <li><a href="#1">4</a></li>
                </ul>

            </div>
        </div>
    </div>
    </div>

    <!--新增,编辑对话框-->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">×</span></button>
                    <h4 class="modal-title" id="myModalLabel">Modal title</h4>
                </div>
                <div class="modal-body">
                    <form id="formModel">
                        <div class="clearfix">
                            {% for field in form %}
                                <div class="form-group">
                                    <label>{{ field.label }}:</label>
                                    {{ field }}
                                    <span class="error-msg" style="color: red"></span>
                                </div>
                            {% endfor %}

                        </div>
                    </form>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                    <button type="button" class="btn btn-primary">保存</button>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

{% block js %}
    <script type="text/javascript" src="{% static 'js/bootstrap-table.min.js' %}"></script>
    <script type="text/javascript" src="{% static 'js/bootstrap-table-treegrid.js' %}"></script>
    <script type="text/javascript" src="{% static 'js/jquery.treegrid.min.js' %}"></script>
    <script type="application/javascript">
        var $table = $('#table');
        {% comment %}var data = JSON.parse(
            '[{"id":1,"pid":0,"status":1,"name":"用户管理","permissionValue":"open:user:manage"},' +
            '{"id":2,"pid":0,"status":1,"name":"系统管理","permissionValue":"open:system:manage"},' +
            '{"id":3,"pid":1,"status":1,"name":"新增用户","permissionValue":"open:user:add"},' +
            '{"id":4,"pid":1,"status":1,"name":"修改用户","permissionValue":"open:user:edit"},' +
            '{"id":5,"pid":1,"status":0,"name":"删除用户","permissionValue":"open:user:del"},' +
            '{"id":6,"pid":2,"status":1,"name":"系统配置管理","permissionValue":"open:systemconfig:manage"},' +
            '{"id":7,"pid":6,"status":1,"name":"新增配置","permissionValue":"open:systemconfig:add"},' +
            '{"id":8,"pid":6,"status":1,"name":"修改配置","permissionValue":"open:systemconfig:edit"},' +
            '{"id":9,"pid":6,"status":0,"name":"删除配置","permissionValue":"open:systemconfig:del"},' +
            '{"id":10,"pid":2,"status":1,"name":"系统日志管理","permissionValue":"open:log:manage"},' +
            '{"id":11,"pid":10,"status":1,"name":"新增日志","permissionValue":"open:log:add"},' +
            '{"id":12,"pid":10,"status":1,"name":"修改日志","permissionValue":"open:log:edit"},' +
            '{"id":13,"pid":10,"status":0,"name":"删除日志","permissionValue":"open:log:del"}]');{% endcomment %}

        var data = JSON.parse('{{result|safe}}')
        $(function () {

            //控制台输出一下数据
            //console.log(data);
            //初始化表格
            inittable();

        });

        //初始化表格
        function inittable() {
            $table.bootstrapTable({
                data: data,
                idField: 'id',
                dataType: 'jsonp',
                columns: [
                    {
                        field: 'check', checkbox: true, formatter: function (value, row, index) {
                            if (row.check == true) {
                                // console.log(row.serverName);
                                //设置选中
                                return {checked: true};
                            }
                        }
                    },
                    {field: 'id', title: '编号', sortable: true, align: 'center'},
                    {field: 'name', title: '名称'},
                    {field: 'icon', title: '图标', sortable: true, align: 'center', formatter: 'iconFormatter'},
                    {field: 'type', title: '类型', sortable: true, align: 'center', formatter: 'typeFormatter'},
                    {field: 'sort', title: '排序'},
                    {field: 'status', title: '状态', sortable: true, align: 'center', formatter: 'statusFormatter'},
                    {field: 'permission', title: '权限值'},
                    {
                        field: 'operate',
                        title: '操作',
                        align: 'center',
                        events: operateEvents,
                        formatter: 'operateFormatter'
                    },
                ],

                // bootstrap-table-treegrid.js 插件配置 -- start

                //在哪一列展开树形
                treeShowField: 'name',
                //指定父id列
                parentIdField: 'pid',

                onResetView: function (data) {
                    //console.log('load');
                    $table.treegrid({
                        initialState: 'collapsed',// 所有节点都折叠
                        // initialState: 'expanded',// 所有节点都展开,默认展开
                        treeColumn: 1,
                        // expanderExpandedClass: 'glyphicon glyphicon-minus',  //图标样式
                        // expanderCollapsedClass: 'glyphicon glyphicon-plus',
                        onChange: function () {
                            $table.bootstrapTable('resetWidth');
                        }
                    });

                    //只展开树形的第一级节点
                    $table.treegrid('getRootNodes').treegrid('expand');

                },
                onCheck: function (row) {
                    var datas = $table.bootstrapTable('getData');
                    // 勾选子类
                    selectChilds(datas, row, "id", "pid", true);

                    // 勾选父类
                    selectParentChecked(datas, row, "id", "pid")

                    // 刷新数据
                    $table.bootstrapTable('load', datas);
                },

                onUncheck: function (row) {
                    var datas = $table.bootstrapTable('getData');
                    selectChilds(datas, row, "id", "pid", false);
                    $table.bootstrapTable('load', datas);
                },
                // bootstrap-table-treetreegrid.js 插件配置 -- end
            });
        }

        // 格式化按钮
        function operateFormatter(value, row, index) {
            return [
                '<button type="button" class="MenuOfadd  btn-xs btn-default" style="margin-right:15px;"><i class="mdi mdi-plus" ></i> 新增</button>',
                '<button type="button" class="MenuOfedit  btn-xs btn-default" style="margin-right:15px;"><i class="mdi mdi-pencil" ></i> 修改</button>',
                '<button type="button" class="MenuOfdelete  btn-xs btn-default" style="margin-right:15px;"><i class="mdi mdi-window-close" ></i> 删除</button>'
            ].join('');

        }

        // 格式化类型
        function typeFormatter(value, row, index) {
            if (value === 'M') {
                return '目录';
            }
            if (value === 'C') {
                return '菜单';
            }
            if (value === 'F') {
                return '按扭';
            }
            return '-';
        }

        function iconFormatter(value, row, index) {
            console.log(value)
            return '<i class="' + value + '"></i>'
        }

        // 格式化状态
        function statusFormatter(value, row, index) {
            if (value === 1) {
                return '<span class="label label-success">正常</span>';
            } else {
                return '<span class="label label-default">锁定</span>';
            }
        }

        //初始化操作按钮的方法
        window.operateEvents = {
            'click .MenuOfadd': function (e, value, row, index) {
                add(row.id, row.name);
            },
            'click .MenuOfdelete': function (e, value, row, index) {
                del(row.id);
            },
            'click .MenuOfedit': function (e, value, row, index) {
                update(row.id);
            }
        };


        /**
         * 选中父项时,同时选中子项
         * @param datas 所有的数据
         * @param row 当前数据
         * @param id id 字段名
         * @param pid 父id字段名
         */
        function selectChilds(datas, row, id, pid, checked) {
            for (var i in datas) {
                if (datas[i][pid] == row[id]) {
                    datas[i].check = checked;
                    selectChilds(datas, datas[i], id, pid, checked);
                }
                ;
            }
        }

        function selectParentChecked(datas, row, id, pid) {
            for (var i in datas) {
                if (datas[i][id] == row[pid]) {
                    datas[i].check = true;
                    selectParentChecked(datas, datas[i], id, pid);
                }
                ;
            }
        }

        function test() {
            var selRows = $table.bootstrapTable("getSelections");
            if (selRows.length == 0) {
                alert("请至少选择一行");
                return;
            }

            var postData = "";
            $.each(selRows, function (i) {
                postData += this.id;
                if (i < selRows.length - 1) {
                    postData += ", ";
                }
            });
            alert("你选中行的 id 为:" + postData);

        }

        function add(id, name) {
            // alert("add 方法 , id = " + name);
            //$('#myModal').modal('show');
            //$('#myModalLabel').text("新增菜单")

            window.location.href = "{% memory_url  request 'menu_add' %}" + "?mid=" + id + "&name=" + name
        }

        function del(id) {
            alert("del 方法 , id = " + id);
        }

        function update(id) {
            alert("update 方法 , id = " + id);
        }


    </script>
{% endblock %}
效果
最近发表
标签列表