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': {},
},
使用的时候注意每种类型需要不同的配置...
Django之CURD插件的更多相关文章
- Django之CURD插件2
目标:达到下图拥有功能的实现 1.绑定编辑按钮 ************思路**************** 1.为编辑按钮添加样式,可以根据样式来进行判断在什么状态. 2.进入编辑模式,将可编辑的字 ...
- CURD插件(仿Django-admin版)
前言 如何提升自己的开发效率? 每个新项目都是自己经做过的项目(经验所致),在项目开发过程中不断总结.封装属于自己的组件, 例如:每个web项目大部分都涉及增删改查,分页显示,搜素,CRM就是这样的组 ...
- django form 组件插件
创建类: class RegForms(forms.Form): account = fields.CharField( required = True, #必填字段 max_length=12, m ...
- django admin后台插件:django-suit入门
去年9月底开始用django来做公司内部项目,开始对django有了一些了解,感觉django真的蛮强大的(也有很多人推荐flask,将来有空的话我会试试).今天的话只是介绍一个小东西,django管 ...
- Django使用DataTables插件总结
Django使用Datatables插件总结 文章中的例子已上传至github 基本使用 Datatables插件是一款方便简单的展示数据的列表插件.关于基本使用,官方网站上的已介绍的很详细,这里我再 ...
- CMDB (后台管理) CURD 插件
查 a. 基本实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Django admin美化插件suit应用[原创]
前言 由于比较懒,自己弄了一个用户验证,没有自己写后台,用了django自带的user认证,并通过admin直接进行管理,但默认的admin并不漂亮,于是使用了这个django-suit插件,效果对比 ...
- Django之前端插件定制之表头
什么是插件? 插件只是辅助,是开发过程中的一个阶段.一般项目一期会用各种插件,迅速将功能.界面搭出来,二期时就改成自己的代码了.大点的公司都有自己的js库,自己开发类似jquery的库. 那接下来就写 ...
- 一个有趣的基于Django的调试插件--django-debug-toolbar
django-debug-toolbar 介绍 django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息. git ...
随机推荐
- ECSHOP去版权(删除ECSHOP所有标识)
前台部分: 1:去掉头部TITLE部分的ECSHOP演示站 Powered by ecshop前者”ECSHOP演示站”在后台商店设置 – 商店标题修改后者” Powered by ecshop”打开 ...
- 百度地图 Android SDK - 标注(Marker)的基本使用
标注(Marker)是开发人员最常使用的地图覆盖物志一.今天就来向大家介绍一些标注(Marker)的最基本用法! 实现目标: 1.构建基础地图页面: 2.在地图的中心点处加入 Marker: 3.实现 ...
- Cocos2d-x 3.1.1 学习日志13--物理引擎登峰造极之路
cocos2dx在设计之初就集成了两套物理引擎,它们是box2d和chipmunk.我眼下使用的是最新版的cocos2dx 3.1.1.引擎中默认使用的是chipmunk.假设想要改使用box2d的话 ...
- Linux下xargs命令详解及xargs与管道的区别
在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以及与管道的区别.为什么要用xarg ...
- Unity里面的自动寻路(二)
接着我的 上一篇自动寻路文章,这一次我们就来学习一下与自动寻路有关的组件吧.Unity中与自动寻路相关的组件主要有两个:NavMeshAgent ( 又称导航网格代理 ),Off Mesh Link ...
- 通过Navicat for MySQL远程连接的时候报错mysql 1130 的解决方法
用Navicat连接远程MYSQL,提示如下错误,我以为是自己的防火墙问题,但是关了,依然不行. ERROR 1130: Host '192.168.1.3' is not allowed to co ...
- TCP/IP详解 卷一(第十九章 TCP的交互数据流)
TCP需要同时处理两类数据:块数据.交互数据. 本章将以Rlogin应用为例观察交互数据的传输过程. 交互式输入 首先观察在一个Rlogin连接上键入一个交互命令时所产生的数据流(每键入一个交互按键都 ...
- 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 ...
- Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介
Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...
- 链表的艺术——Linux内核链表分析
引言: 链表是数据结构中的重要成员之中的一个.因为其结构简单且动态插入.删除节点用时少的长处,链表在开发中的应用场景许多.仅次于数组(越简单应用越广). 可是.正如其长处一样,链表的缺点也是显而易见的 ...