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

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

Django之CURD插件的更多相关文章

  1. Django之CURD插件2

    目标:达到下图拥有功能的实现 1.绑定编辑按钮 ************思路**************** 1.为编辑按钮添加样式,可以根据样式来进行判断在什么状态. 2.进入编辑模式,将可编辑的字 ...

  2. CURD插件(仿Django-admin版)

    前言 如何提升自己的开发效率? 每个新项目都是自己经做过的项目(经验所致),在项目开发过程中不断总结.封装属于自己的组件, 例如:每个web项目大部分都涉及增删改查,分页显示,搜素,CRM就是这样的组 ...

  3. django form 组件插件

    创建类: class RegForms(forms.Form): account = fields.CharField( required = True, #必填字段 max_length=12, m ...

  4. django admin后台插件:django-suit入门

    去年9月底开始用django来做公司内部项目,开始对django有了一些了解,感觉django真的蛮强大的(也有很多人推荐flask,将来有空的话我会试试).今天的话只是介绍一个小东西,django管 ...

  5. Django使用DataTables插件总结

    Django使用Datatables插件总结 文章中的例子已上传至github 基本使用 Datatables插件是一款方便简单的展示数据的列表插件.关于基本使用,官方网站上的已介绍的很详细,这里我再 ...

  6. CMDB (后台管理) CURD 插件

    查 a. 基本实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  7. Django admin美化插件suit应用[原创]

    前言 由于比较懒,自己弄了一个用户验证,没有自己写后台,用了django自带的user认证,并通过admin直接进行管理,但默认的admin并不漂亮,于是使用了这个django-suit插件,效果对比 ...

  8. Django之前端插件定制之表头

    什么是插件? 插件只是辅助,是开发过程中的一个阶段.一般项目一期会用各种插件,迅速将功能.界面搭出来,二期时就改成自己的代码了.大点的公司都有自己的js库,自己开发类似jquery的库. 那接下来就写 ...

  9. 一个有趣的基于Django的调试插件--django-debug-toolbar

    django-debug-toolbar 介绍 django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息. git ...

随机推荐

  1. ECSHOP去版权(删除ECSHOP所有标识)

    前台部分: 1:去掉头部TITLE部分的ECSHOP演示站 Powered by ecshop前者”ECSHOP演示站”在后台商店设置 – 商店标题修改后者” Powered by ecshop”打开 ...

  2. 百度地图 Android SDK - 标注(Marker)的基本使用

    标注(Marker)是开发人员最常使用的地图覆盖物志一.今天就来向大家介绍一些标注(Marker)的最基本用法! 实现目标: 1.构建基础地图页面: 2.在地图的中心点处加入 Marker: 3.实现 ...

  3. Cocos2d-x 3.1.1 学习日志13--物理引擎登峰造极之路

    cocos2dx在设计之初就集成了两套物理引擎,它们是box2d和chipmunk.我眼下使用的是最新版的cocos2dx 3.1.1.引擎中默认使用的是chipmunk.假设想要改使用box2d的话 ...

  4. Linux下xargs命令详解及xargs与管道的区别

    在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以及与管道的区别.为什么要用xarg ...

  5. Unity里面的自动寻路(二)

    接着我的 上一篇自动寻路文章,这一次我们就来学习一下与自动寻路有关的组件吧.Unity中与自动寻路相关的组件主要有两个:NavMeshAgent (  又称导航网格代理 ),Off Mesh Link ...

  6. 通过Navicat for MySQL远程连接的时候报错mysql 1130 的解决方法

    用Navicat连接远程MYSQL,提示如下错误,我以为是自己的防火墙问题,但是关了,依然不行. ERROR 1130: Host '192.168.1.3' is not allowed to co ...

  7. TCP/IP详解 卷一(第十九章 TCP的交互数据流)

    TCP需要同时处理两类数据:块数据.交互数据. 本章将以Rlogin应用为例观察交互数据的传输过程. 交互式输入 首先观察在一个Rlogin连接上键入一个交互命令时所产生的数据流(每键入一个交互按键都 ...

  8. Database returned an invalid value in QuerySet.datetimes(). Are time zone definitions for your datab

    Database returned an invalid value in QuerySet.datetimes(). Are time zone definitions for your datab ...

  9. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

  10. 链表的艺术——Linux内核链表分析

    引言: 链表是数据结构中的重要成员之中的一个.因为其结构简单且动态插入.删除节点用时少的长处,链表在开发中的应用场景许多.仅次于数组(越简单应用越广). 可是.正如其长处一样,链表的缺点也是显而易见的 ...