当前位置: 首页 > 编程日记 > 正文

CRM——插件流程回顾

1. Django项目启动 自动加载文件 制作启动文件1. 注册strak 在apps.py 类里面增加如下 def ready(self):from django.utils.module_loading import autodiscover_modulesautodiscover_modules("stark")2. 在已经注册的app中创建stark.py文件 加载2. 在stark中模仿AdminSite ModelAdmin类写代码 注册自己的类class StarkConfig(object):def __init__(self,model_class,site):self.model_class = model_classself.site = siteclass StarkSite(object):def __init__(self):self._registey = {}def register(self,model_class,stark_config_class=None):if not stark_config_class:stark_config_class = StarkConfigself._registey[model_class] = stark_config_class(model_class,self)site = StarkSite()3. 将注册的类自动生成url- urls.pyfrom stark.service import v1urlpatterns = [url(r'^stark/', v1.site.urls),]- 为每个类生成4个url v1.py class StarkConfig(object):def __init__(self,model_class,site):self.model_class = model_classself.site = sitedef get_urls(self):app_model_name = (self.model_class._meta.app_label,self.model_class._meta.model_name,)url_patterns = [url(r'^$',self.changelist_view,name="%s_%s_changlist" %app_model_name),url(r'^add/$',self.add_view,name="%s_%s_add" %app_model_name),url(r'^(\d+)/delete/$',self.delete_view,name="%s_%s_delete" %app_model_name),url(r'^(\d+)/change/$',self.change_view,name="%s_%s_chang" %app_model_name),]return url_patterns@propertydef urls(self):return self.get_urls()def changelist_view(self,request,*args,**kwargs):return HttpResponse('列表')def add_view(self,request,*args,**kwargs):return HttpResponse('添加')def delete_view(self,request,nid,*args,**kwargs):return HttpResponse('删除')def change_view(self,request,nid,*args,**kwargs):return HttpResponse('修改')class StarkSite(object):def __init__(self):self._registey = {}def register(self,model_class,stark_config_class=None):if not stark_config_class:stark_config_class = StarkConfigself._registey[model_class] = stark_config_class(model_class,self)def get_urls(self):url_pattern = []for model_class,stark_config_obj in self._registry.items():app_name = model_class._meta.app_labelmodel_name = model_class._meta.model_namecurd_url = url(r'^%s/%s/' %(app_name,model_name,) , (stark_config_obj.urls,None,None))url_pattern.append(curd_url)return url_pattern@propertydef urls(self):return (self.get_urls(),None,'stark')site = StarkSite()4. 列表页面展示- v1.pydef changelist_view(self,request,*args,**kwargs):# 处理表头head_list = []for field_name in self.list_display:if isinstance(field_name,str):# 根据类和字段名称,获取字段对象的verbose_nameverbose_name = self.model_class._meta.get_field(field_name).verbose_nameelse:verbose_name = field_name(self,is_header=True)head_list.append(verbose_name)# 处理表中的数据# [ UserInfoObj,UserInfoObj,UserInfoObj,UserInfoObj,]# [ UserInfo(id=1,name='alex',age=18),UserInfo(id=2,name='alex2',age=181),]data_list = self.model_class.objects.all()new_data_list = []for row in data_list:# row是 UserInfo(id=2,name='alex2',age=181)# row.id,row.name,row.agetemp = []for field_name in self.list_display:if isinstance(field_name,str):val = getattr(row,field_name) # # 2 alex2else:val = field_name(self,row)temp.append(val)new_data_list.append(temp)return render(request,'stark/changelist.html',{'data_list':new_data_list,'head_list':head_list})- shark.pyclass UserInfoConfig(v1.StarkConfig):def checkbox(self,obj=None,is_header=False):if is_header:return '选择'return mark_safe('<input type="checkbox" name="pk" value="%s" />' %(obj.id,))def edit(self,obj=None,is_header=False):if is_header:return '编辑'return mark_safe('<a href="/edit/%s">编辑</a>' %(obj.id,))list_display = [checkbox,'id','name',edit]4. 显示增加按钮- 先判断是否显示,再通过反向解析生成增加链接- 后端# 是否显示增加按钮show_add_btn = Truedef get_show_btn(self):return self.show_add_btnreturn render(request, 'stark/changelist.html', {'data_list': new_data_list, 'head_list': head_list,"add_url":self.get_add_url(),"show_add_btn":self.get_show_btn()})- 前端{% if show_add_btn %}<a class="btn btn-primary" href="{{ add_url }}">增加</a>{% endif %}5. 增加内容页面1. 通过ModelForm创建公共类 显示和提交- 后端def add_view(self, request, *args, **kwargs):class AddTable(ModelForm):class Meta:model = self.model_classfields = "__all__"if request.method == "GET":form = AddTable()return render(request,"stark/add_view.html",{"form":form})else:form = AddTable(request.POST)if form.is_valid():form.save()return redirect(self.get_list_url())else:return render(request, "stark/add_view.html", {"form": form})- 前端<form method="post" novalidate>{% csrf_token %}{{ form.as_p }}<input type="submit" value="提交"></form>2. 升级 在子类自定义ModelForm类 子类之后可以自定义类- v1.pymodel_form_class = Nonedef get_model_form_class(self):if self.model_form_class:return self.model_form_classelse:#方式一:# class AddTable(ModelForm):#     class Meta:#         model = self.model_class#         fields = "__all__"# return AddTable#方式二:meta = type("Meta",(object,),{"model":self.model_class,"fields":"__all__"})AddTable = type("AddTable",(ModelForm,),{"Meta":meta})return AddTabledef add_view(self, request, *args, **kwargs):model_form_class = self.get_model_form_class()if request.method == "GET":form = model_form_class()return render(request,"stark/add_view.html",{"form":form})else:form = model_form_class(request.POST)if form.is_valid():form.save()return redirect(self.get_list_url())else:return render(request, "stark/add_view.html", {"form": form})- stark.pyclass UserInfoModelForm(ModelForm):class Meta:model = models.UserInfofields = ["name","password"]error_messages = {"name":{'required':'用户名不能为空'}}class UserInfoConfig(v1.StarkConfig):model_form_class = UserInfoModelForm6. 修改 和 删除def change_view(self, request, nid, *args, **kwargs):obj = self.model_class.objects.filter(pk=nid).first()if not obj:return redirect(self.get_list_url())model_form_class = self.get_model_form_class()if request.method == "GET":form = model_form_class(instance=obj)return render(request,"stark/change_view.html",{"form":form})else:form = model_form_class(instance=obj,data=request.POST)if form.is_valid:form.save()return redirect(self.get_list_url())return render(request,"stark/change_view.html",{"form":form})def delete_view(self, request, nid, *args, **kwargs):self.model_class.objects.filter(pk=nid).delete()return redirect(self.get_list_url())

转载于:https://www.cnblogs.com/shaojiafeng/p/8108451.html

相关文章:

Linux驱动:TI达芬奇系列kernel中cup类型的判断,以cpu_is_ti81xx()为例

cpu_is_ti81xx() 为真 cpu.h (arch\arm\plat-omap\include\plat) 1、 # define cpu_is_ti81xx() is_ti81xx() # define cpu_is_ti814x() is_ti814x() 2、 #define IS_TI_CLASS(class, id) \ static inline int is…

IT人请注意你的身体![转]

IT人请注意你的身体![转]IT一直是很多人的梦想&#xff0c;外行的无数人挤破了脑袋想进这个圈子&#xff0c;在一般人看来&#xff0c;他们是时代的宠儿&#xff0c;他们可以不修边幅&#xff0c;他们工作时间可以身着便装&#xff0c;他们可以不受早九晚五的束缚&#xff0c;他…

WF4.0实战(六):控制WPF动画

这个例子改造了王晓冬老师的&#xff1a;用WF流程控制WPF动画。 本文用一个小例子演示了在WF中定义两个操作步骤,用来控制WPF页面元素的动画。王冬老师当时使用的是WF3.0,现在我改成WF4.0。 先看效果&#xff1a; 活动&#xff1a; 流程&#xff1a; 实现&#xff1a;实现很简单…

嵌入式学习:存储器总结

1、nor flash&#xff1a;NOR采用的并行接口&#xff0c;其特点读取的速度比之NAND快乐很多倍&#xff0c;其程序可以直接在NOR里面运行。但是它的擦除速度比较慢&#xff0c;集成度低&#xff0c;成本高的。现在的NOR的容量一般在2M左右&#xff0c;一般是用在代码量小的嵌入式…

10门必看的机器学习免费课程

整理 | 琥珀出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;文本将介绍来自全球10所著名学府的机器学习和数据科学领域的免费公开课程&#xff0c;范围涉及从入门机器学习到自然语言处理等。1、机器学习华盛顿大学链接&#xff1a;https://courses.cs.washington.ed…

golang实现给图片加水印

2019独角兽企业重金招聘Python工程师标准>>> 最近跟在写golang图片加水印的方法&#xff0c;这里用的是一些基本的功能。 package mainimport ("fmt""image""image/draw""image/jpeg""image/png""os" …

编译android不再需要jdk1.5

2019独角兽企业重金招聘Python工程师标准>>> 今天编译Android的时候发现jdk不是1.5都可以通过。 转载于:https://my.oschina.net/zengsai/blog/4103

来自程序员的福利!用Python做一款翻译软件

来源 | Ahab杂货铺&#xff08;ID&#xff1a;PythonLearningCamp&#xff09;前两天吃了平哥的一波狗粮&#xff0c;他给女朋友写了一个翻译软件&#xff0c;自己真真切切的感受到了程序员的浪漫。在学习requests请求的时候做过类似的Demo&#xff0c;给百度翻译发送一个post请…

海思3536:osdrv编译过程中报错及解决方法

1、安装交叉编译工具 1.1 cd toolchain/arm-hisiv300-linux/ 1.2 tar -xvf arm-hisiv300-linux.tar.bz2 1.3 修改cross.install&#xff1a;使用bash 1.4 sudo ./cross.instal 1.5 执行source /etc/profile&#xff0c; 安装交叉编译器的脚本配置的环境变量就可以生效了 2…

Vmware linux 无法上网

流程如下&#xff1a; 1)点击 VM->Settings Hardware选项卡下面 2&#xff09;点击Network Adapter 设置如下图所示&#xff0c;首先我们在虚拟机中将网络配置设置成NAT&#xff0c; 3、进入Windows操作系统&#xff0c;然后右键点击我们的电脑&#xff0c;进入到管理界面 …

编程25年后,现实将我打回菜鸟程序员的起点

在从事了 25 年的编程工作后&#xff0c;我却发现自己没有什么具体的东西可以展示给大家。我需要克服完美主义思想和对被批评的恐惧&#xff0c;向大家展示真实的自己。作者 | DeChamp译者 | 苏本如责编 | 仲培艺出品 | CSDN&#xff08;ID&#xff1a;CSDNNews&#xff09;下面…

MOSS 2010:Visual Studio 2010开发体验(14)——列表开发之事件接收器

通过前面几篇&#xff0c;我们已经完成了内容类型&#xff0c;列表定义&#xff0c;列表实例的开发。本篇继续讲解列表中的一个重要环节——事件接收器开发。 我们的场景是&#xff1a;我希望之前做好的订单列表这个内容类型自动地具有某些事件特征&#xff0c;例如当用户在添加…

海思3536:kernel编译和mpp_single编译过程报错及解决方法

### 1、编译kernel 1.1 cd kernel/linux-3.10.y 1.2 cp arch/arm/configs/hi3536_full_defconfig.config 1.3 make ARCHarmCROSS_COMPILEarm-hisiv300-linux- menuconfig 1.4 make ARCHarmCROSS_COMPILEarm-hisiv300-linux- uImage 1.4.1 弹出选择板子型号&#xff1a;39&…

026——VUE中事件修饰符之使用$event与$prevent修饰符操作表单

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>事件修饰符之使用$event与$prevent修饰符操作表单</title><script src"vue.js"></script> </head> <body> &…

Linux shell脚本基础学习

Linux shell脚本基础学习这里我们先来第一讲&#xff0c;介绍shell的语法基础&#xff0c;开头、注释、变量和 环境变量&#xff0c;向大家做一个基础的介绍&#xff0c;虽然不涉及具体东西&#xff0c;但是打好基础是以后学习轻松地前提。1. Linux 脚本编写基础◆1.1 语法基本…

海思3536:PC客户端编译过程报错及解决方法

1、Hi3536V100R001C02SPC040版本编译出错 --------- 错误 4 error LNK2001: 无法解析的外部符号 _IveOpenFile D:\share\Hi3536V100R001C02SPC040\01.software\pc\IVE_CLIB\HiIVE_PC_V2.0.0.7\sample\ive_samples_2.0\Integ\ive_clib_2.0.lib(ive_clib.obj) 错误 5 error LNK20…

百度15篇论文被AAAI 2019收录

1月27日&#xff0c;第33届 AAAI&#xff08;AAAI 2019&#xff09;在美国夏威夷召开&#xff0c;其中百度共有15篇论文被收录。AAAI于1979年成立&#xff0c;是国际人工智能领域的顶级国际会议。这一协会如今在全球已有超过6000名的会员&#xff0c;汇集了全球最顶尖的人工智能…

使用 xcworkspace 管理 iOS 工程

首先创建目标工程 创建工作空间xcworkspace文件&#xff0c;并将创建的*.xcworkspace文件放到刚创建的目标工程同级目录下 关闭刚刚创建的目标工程&#xff0c;打开*.xcworkspace文件&#xff0c;把刚刚创建的目标工程添加到工作空间中来 如果要添加一些框架&#xff0c;则将目…

Windows 2008 部署服务之Windows 7 应答文件创建

——————————————————————————————Windows 2008 部署服务八步走&#xff1a;1、Windows 2008 部署服务之WDS概述 2、Windows 2008 部署服务之WDS安装及配置 3、Windows 2008 部署服务之添加启动映像 4、Windows 2008 部署服务之Windows XP应答文件…

DotNetCore跨平台~System.DrawingCore部署Linux需要注意的

回到目录 你在windows上使用图像组件没有任务问题&#xff0c;但部署到linux之后&#xff0c;将注意以下几点&#xff1a; 安装nuget包ZKWeb.System.Drawing项目里还是引用System.DrawingCore&#xff0c;这点不用改安装gdiplus插件&#xff0c;这个需要根据linux类型不同&…

iPhone曝严重漏洞,用户接听FaceTime前或被“监听”!

作者 | 琥珀 出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09; 近日&#xff0c;据 9to5Mac 等多家外媒报道&#xff0c;苹果手机 FaceTime 一项重大漏洞被曝光&#xff0c;该漏洞可以让用户通过 FaceTime 群聊功能&#xff08;Group FaceTime&#xff09;打电话给任…

海思3536:交叉编译Qt4.8.4

一、交叉编译qt 1、下载Qt源码包qt-everywhere-opensource-src-4.8.4.tar.gz; 2、解压Qt源码包tar -xvfzqt-everywhere-opensource-src-4.8.4.tar.gz 3、创建qmake.conf 3.1在qt-everywhere-opensource-src-4.8.4/mkspecs/qws/下创建linux-hisiv400-g++; 3.2将qt-everyw…

理解LoadRunner中的局部变量和全局变量

以下内容均选自个人作品&#xff1a;《精通软件性能测试与LoadRunner实战》在C语言中&#xff0c;变量有效性的范围称变量的作用域。不仅对于形参变量&#xff0c;&#xff23;语言中所有的量都有自己的作用域&#xff0c;按作用域范围不同&#xff0c;可分为局部变量和全局变量…

TI-DM8127:MCFW、ISS中对sensor的驱动和控制

1、sensor生命周期 mcfw的bios6层调用iss接口Iss_platformDeviceInit()&#xff0c;该接口调用sensor&#xff08;以IMX185为例&#xff09;初始化Iss_Imx185Init()&#xff0c;通过HDVPSS提供的FVID2接口FVID2_registerDriver去注册一个FVID2设备&#xff0c;bios6再创建一个…

小米开源FALSR算法:快速精确轻量级的超分辨率模型

作者 | 周强&#xff08;我爱计算机视觉&#xff09;、刘畅编辑 | Jane出品 | AI科技大本营这是来自小米最新出炉的论文&#xff0c;使用神经架构搜索技术自动确定超分辨率网络模型&#xff0c;取得了又快又好的效果&#xff0c;模型已开源&#xff0c;非常赞&#xff01;摘要深…

Node.js服务器启用Gzip压缩

Gzip是什么 复制大神们的解释吧&#xff1a; GZIP最早由Jean-loup Gailly和Mark Adler创建&#xff0c;用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件&#xff0c;它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式&#xff0c;或…

【bzoj1251】序列终结者(伸展树)

【bzoj1251】序列终结者&#xff08;伸展树&#xff09; Description 网上有许多题&#xff0c;就是给定一个序列&#xff0c;要你支持几种操作&#xff1a;A、B、C、D。一看另一道题&#xff0c;又是一个序列 要支持几种操作&#xff1a;D、C、B、A。尤其是我们这里的某人&…

再谈PowerPoint 2010导出幻灯片为图片

前些日子写了篇《利用VBA导出幻灯片为图片》&#xff0c;结果被Jackson告知&#xff0c;PowerPoint 2010已经有此功能了&#xff0c;并且PowerPoint 2007可能就已经有了。并且经最终验证&#xff0c;在PowerPoint 2003中同样有此功能。由于平时用PowerPoint并不多&#xff0c;所…

【网络编程】非阻塞connect详解

一、为什么使用非阻塞connect TCP连接的建立涉及一个在三路握手过程&#xff0c;阻塞的connect一直等到客户收到自己的SYN的ACK才返回&#xff0c;这需要至少一个RTT时间&#xff0c;RTT时间波动很大从几毫秒到几秒。而且在没有响应时&#xff0c;会等待数秒再次发送&#xff0…

AI,被“横扫记录”反噬?

编辑 | Jane 出品 | AI科技大本营 昨天&#xff0c;香侬科技发表论文《Glyce: Glyph-vectors for Chinese Character Representations》&#xff0c;提出基于中文字形的 NLP 模型——Glyce。香侬科技官方公开的论文解读中写道&#xff1a; Glyce提出了基于中文字形的语义表示&…