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