1. 程式人生 > >Django之CURD外掛

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': {},
            },
        ]

從上面可以看出來,我們根據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)

放在列表裡面的是我們想要拿到的資料庫欄位名資料.

操作沒有資料則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)
            }
        });

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
    };

通過自定製,我們可以用.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);

        })
    }

這裡執行了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'},
            },

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
        })
    }

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
    }

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)
                                }
                        });

在這裡設定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': {},
},

https://www.cnblogs.com/chenxuming/p/9253361.html