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': {},
},
使用的时候注意每种类型需要不同的配置...