zoukankan      html  css  js  c++  java
  • Django之CURD插件

    什么是CURD?

    CURD顾名思义就是create,update,rearch,delete(所谓的增删改查).

    当我们接到一个项目的时候,夸夸夸的就写完表结构,然后就一直写增删改查,增删改查,写了一个月,看似很认真效率很高,但是这里我要严肃的告诉你。你只需要一个配置文件就可以完成对表进行增删改查.什么???你不信??and那么看看。

    1.配置文件

    配置文件需要放上面?

    1.confi [{'q':数据库的字段名,

        'title':表单的head名

        'display' :1/0 是否可以显示

        text:{content:.....

          kwargs:{......}}}]

    2.数据库内容

    3.全局变量,主要针对的是choice

    4.分页

            msg={
                'config':config,
                'data_list':list(data_list),
                'global_dict':{
                    'user_choice':models.UserInfo.user_choice,
                },
                'page_str':page_str,
            }
    
    
     config = [
                {
                    'q': None,
                    'title': '选项',
                    'display': 1,
                    'text': {
                        'content':'<input type="checkbox"/>'
                    },
                    'attrs': {},
                },
                {
                    'q': 'id',
                    'title': 'ID',
                    'display': 0,
                    'text':None,
                    'attrs': {},
                },
                {
                    'q': 'username',
                    'title': '姓名',
                    'display': 1,
                    'text':{'content':'{username}',
                            'kwargs':{'username':'@username'}},
                    'attrs': {'edit-enalbe':'true','edit-type':'input',
                              'name':'username','origin':'@username'},
                },
                {
                    'q': 'user_type',
                    'title': '用户类型',
                    'display': 1,
                    'text': {'content': '{n}',
                             #               @@ 后面的数据是要选择的元组
                             #                和一个@的区分开
                             'kwargs': {'n': '@@user_choice'}},
                    'attrs': {'edit-enalbe':'true', 'edit-type':'select'
                               ,'global-name':'user_choice','origin':'@user_type',
                              'name':'user_type'},
                },
                {
                    'q': 'nickname',
                    'title': '昵称',
                    'display': 1,
                    'text': {'content': '{nick}',
                             'kwargs': {'nick': '@nickname'}},
                    'attrs': {'edit-enalbe': 'true', 'edit-type': 'input',
                              'name':'nickname','origin':'@nickname'},
    
                },
                {
                    'q': 'user2blog__surfix',
                    'title': '博客地址',
                    'display': 1,
                    'text': {'content': '{n}',
                             'kwargs': {'n': '@user2blog__surfix'}},
                    'attrs': {'edit-enalbe':'fault'},
    
                },
                {
                    'q': None,
                    'title': '操作',
                    'display': 1,
                    'text': {'content': '<a href="/index-{nid}">{m}</a>',
                             'kwargs': {'nid': '@id',"m":'查看详细'}},
                    'attrs': {},
                },
            ]
    View Code

    从上面可以看出来,我们根据q为字段去数据库中拿数据

    q_list =[]
            for item in config:
                if not item['q']:
                    continue
                q_list.append(item['q'])
            data_list_count = models.UserInfo.objects.all().values(*q_list)
    View Code

    放在列表里面的是我们想要拿到的数据库字段名数据.

    操作没有数据则q为None

    2.初始化table的head

      function initHead(config) {
            $('#talbe_th').empty();
            var tr = $('<tr></tr>');
            $.each(config,function (k,v) {
                if (v.display){
                    var th=$('<th></th>');
                    th.html(v.title);
                    tr.append(th)
                }
            });
    View Code

    3.{}的格式化

    在配置文件中可以看到,conten:'{username}-{id}'

    {}里面只的是我们需要格式化的内容,js没有格式化的函数,那么需要我们自定制.

        String.prototype.format = function (kwargs) {
            var ret = this.replace(/{(w+)}/g,function (km,m) {
    //               {username}-{id}
    //                匹配成功后,km等于{username}和{id}, m等于 username和id
    //                'kwargs':{'username':'chenxuming','id':'1'}}
                return kwargs[m]
                                });
            return ret
        };
    View Code

    通过自定制,我们可以用.format方法进行格式化.

    4.一个@

    配置文件中有一个@的符号的代表取数据库中的数据.

    如何取?

    **思路**

    嵌套三层循环

    1.第一层:

    数据库取到的数据循环,主要是循环取到数据库的行数........行用一个tr标签

    2.第二层,循环配置文件的config列表,列表嵌套了多个字典

    每一个字典创建一个td标签

    因为每一行都要有n列数据,字典里就有n个需要循环遍历.

    3.第三层循环:
    循环每一个config_values里的kwargs('kwargs':{'username':'@username','id':'@id'})
    将带@符号的kwargs字典值替换数据库的值,没带的则不对应放在新的字典里 new_kwargs
    最后将new_kwargs进行格式化转换

    function initBody(config,data_list) {
            $("#table_tb").empty();
    
    //       第一层
     $.each(data_list,function (data_key,data_values) {
                var tr = $('<tr></tr>');
                tr.attr('row-id',data_values['id']);
    
    //           第二层,循环配置文件的config列表
    //                 一个字典里:  {
    //               'q': 'username',
    //               'title': '姓名',
    //               'display': 1,
    //               'text':{'content':'{username}-{id}',
    //                       'kwargs':{'username':'@username','id':'@id'}
            $.each(config,function (config_key,config_values) {
                if (config_values.display){
                    var new_kwargs={};
                    var td=$('<td></td>');
    
    //                   第三层
    $.each(config_values.text.kwargs,function (key,values) {else if (values[0]=='@'){
    //                                 有一个@的代表去数据库的值
                                    new_kwargs[key] = data_values[values.substring(1,values.length)];
                                }
                                else{
                                    new_kwargs[key] = values
                                }
                                }
                                );
                    var temp = config_values.text.content.format(new_kwargs);
                        td.html(temp);
                        tr.append(td)
                    }
                                });
                $("#table_tb").append(tr);
    
            })
        }
    View Code

    这里执行了initBody(config,data_list)初始化了body

    5.两个@

    有两个@的代表了在choice取数据,编辑的时候生成select框.

    **思路**

    1,在config里@@后面的内容是choice存放元组的字段名,而''q''里存放的是choice选择的字段名.Intergerfile)

    {
                    'q': 'user_type',
                    'title': '用户类型',
                    'display': 1,
                    'text': {'content': '{n}',
                             #               @@ 后面的数据是要选择的元组
                             #                和一个@的区分开
                             'kwargs': {'n': '@@user_choice'}},
                    'attrs': {'edit-enalbe':'true', 'edit-type':'select'
                               ,'global-name':'user_choice','origin':'@user_type',
                              'name':'user_type'},
                },
    View Code

    2.在前端初始化把choice元组设置成全局变量,因为很多地方都可以用到.

        function initglobal(global_dict) {
    //       设置全局变量;
    //       'global_dict':{
    //               'user_choice':models.UserInfo.user_choice,}
    //       拿到的是字符串,想要user_choice=models.UserInfo.user_choice
    //        等于
    //      window['user_choice']=models.UserInfo.user_choice
            $.each(global_dict,function (k,v) {
                window[k] =v
            })
        }
    View Code

    3.在全局变量里获取@@的值

    放在第三个循环里.
    两个@@是if
    一个@是else if
    if (values.substring(0,2) =='@@'){
                                // {#有两个@代表取choice里的值
    //                               user_choice=(
    //                                   (1,'普通用户'),
    //                                   (2,'VIP'),
    //                               )
                                    var global_name = values.substring(2,values.length);
                                    var current_id = data_values[config_values.q];
                                    var ret = GetTextFromGlobalById(global_name,current_id);
                                    new_kwargs[key] =ret
                                }
    
    function GetTextFromGlobalById(global_name,current_id) {
            var ret = null;
            $.each(window[global_name],function (k,item) {
    //           console.log(item,current_id)
    //               [1, "普通用户"]      1
    //               [2, "VIP"]          1
    //               [1, "普通用户"]      1
    //               [2, "VIP"]          1
    //          如果 item[0] == current_i 返回内容 return跳出循环
                if (item[0] == current_id){
                    ret = item[1];
                    return
                }
            });
            return ret
        }
    View Code

    6.设置attr(标签的属性)

    给标签设置attr属性.

    可编辑,不可编辑,编辑类型.

    设置attr在第二层循环的时候加一层.和并列第三层

    //                         循环attrs,将属性和值赋值给标签.
    //                      'attrs': {'edit': 'true', 'edit-type': 'select'},
                        $.each(config_values.attrs,function (attrs_key,attrs_values) {
                                if (attrs_values[0]=='@'){
                                    td.attr(attrs_key,data_values[attrs_values.substring(1,attrs_values.length)])
                                }
                                else{
                                    td.attr(attrs_key,attrs_values)
                                    }
                            });
    View Code

    在这里设置attr的时候可以通过@的符号来获取数据库的值.

    跨表的时候q用__来跨表''q'':'FK__'

    7.简单的使用

    1.选项:

    {
    'q': None,
    'title': '选项',
    'display': 1,
    'text': {
    'content':'<input type="checkbox"/>'
    },
    'attrs': {},

    },

    2.不显示的
    {
    'q': 'id',
    'title': 'ID',
    'display': 0,
    'text':None,
    'attrs': {},

    },
    3.显示且可以编辑的:
    {
    'q': 'username',
    'title': '姓名',
    'display': 1,
    'text':{'content':'{username}',
    'kwargs':{'username':'@username'}},
    'attrs': {'edit-enalbe':'true','edit-type':'input',
    'name':'username','origin':'@username'},

    },
    4.跨表....显示不可编辑的:
    {
    'q': 'user2blog__surfix',
    'title': '博客地址',
    'display': 1,
    'text': {'content': '{n}',
    'kwargs': {'n': '@user2blog__surfix'}},
    'attrs': {'edit-enalbe':'fault'},

    },
    5.choice类型:
    {
    'q': 'user_type',
    'title': '用户类型',
    'display': 1,
    'text': {'content': '{n}',
    # @@ 后面的数据是要选择的元组
    # 和一个@的区分开
    'kwargs': {'n': '@@user_choice'}},
    'attrs': {'edit-enalbe':'true', 'edit-type':'select'
    ,'global-name':'user_choice','origin':'@user_type',
    'name':'user_type'},
    },
    6.操作类型.
    {
    'q': None,
    'title': '操作',
    'display': 1,
    'text': {'content': '<a href="/index-{nid}">{m}</a>',
    'kwargs': {'nid': '@id',"m":'查看详细'}},
    'attrs': {},
    },

    使用的时候注意每种类型需要不同的配置...

  • 相关阅读:
    基于ASP.NET的comet简单实现
    常用的富文本框插件FreeTextBox、CuteEditor、CKEditor、FCKEditor、TinyMCE、KindEditor ;和CKEditor实例
    关于Application.Lock和Lock(obj)
    asp.net 母版页使用详解--转
    ASP.NET 全局变量和页面间传值方法
    黑帽大会2014:10个酷炫的黑客工具
    python之高性能网络编程并发框架eventlet实例
    eCos中的线程与同步
    Ubuntu12.04 下修改Apache端口号
    PHP 之mysql空字符串问题
  • 原文地址:https://www.cnblogs.com/chenxuming/p/9253361.html
Copyright © 2011-2022 走看看