python+Django CRM客户关系管理系统开发(七)--修改功能开发

摘要:
本节开发修改数据功能。所以可以说python中所有类都是type创建的。对元类的理解与注意事项元类就是类的类,python中函数type实际上是一个元类。Python中所有的东西——都是对象。

一、本节目标

前几节完成了admin功能首页,数据展示,过滤,搜索,排序,分页等功能。本节开发修改数据功能。

二、功能分析

1、admin的实现方法是,(1)、点击第一列的数据,(2)、然后跳转到修改页面,链接中增加了对象的id

python+Django CRM客户关系管理系统开发(七)--修改功能开发第1张

python+Django CRM客户关系管理系统开发(七)--修改功能开发第2张

python+Django CRM客户关系管理系统开发(七)--修改功能开发第3张

python+Django CRM客户关系管理系统开发(七)--修改功能开发第4张

三、功能开发

1、我们也仿照admin的方法,给第一列添加一个超链接。

admin是根据这个对象的id来确定是哪个修改的对象,然后进行修改,我们这里也需要获取对象的id。通过obj.id即可获取id

python+Django CRM客户关系管理系统开发(七)--修改功能开发第5张

获取id结果:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第6张

因此修改tag:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第7张

页面点击之后,显示如下:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第8张

2、接下来需要做的是跳转过去的页面,以及视图函数:

此时添加了链接,并可以点击

python+Django CRM客户关系管理系统开发(七)--修改功能开发第9张

但是点击之后报错:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第10张

经过查找,报错原因为,这个位置匹配的不对:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第11张

花了将近五个小时,最后发现把url调整了一下,才正确,哎,原来是因为没写正则匹配开头符号 ^ 这条url会被一直匹配,导致其他的url不能被匹配。 学会查看报错信息,然后自己尝试各种方法解决

python+Django CRM客户关系管理系统开发(七)--修改功能开发第12张

正常跳转到修改页面:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第13张

3、能正常跳转到修改页面之后,接下来就是如何显示要修改的数据的问题了。

python+Django CRM客户关系管理系统开发(七)--修改功能开发第14张

像admin这样,修改页面能够显示每个字段以及值,这里要用到动态生成类的方法。

python中一切都是对象,类也是对象;只不过是一种特殊的对象,是type的对象

class Animal():
pass
cat = Animal()
print(cat) #<__main__.Animal object at 0x0000016728CE9BE0>
print(type(Animal)) #<class 'type'>

使用type创建类:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第15张

python+Django CRM客户关系管理系统开发(七)--修改功能开发第16张

当type()只有一个参数时,其作用就是返回变量或对象的类型
当type()有三个参数时,其作用就是创建类对象:
  第一个参数:name表示类名称,字符串类型
  第二个参数:bases表示继承对象(父类),元组类型,单元素后边加逗号
  第三个参数:attr表示属性,这里可以填写类属性、类方式、静态方法(必须加self),采用字典格式,key为属性名,value为属性值

通过type添加的属性是类属性,并不是实例属性

通过type可以给类添加普通方法,静态方法,类方法,效果跟class一样

type创建类的效果,包括继承等的使用性质和class创建的类一样。本质class创建类的本质就是用type创建。所以可以说python中所有类都是type创建的。

对元类的理解与注意事项

元类就是类的类,python中函数type实际上是一个元类。type就是Python在背后用来创建所有类的元类。Python中所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来,这个类就是type。type就是Python的内建元类,当然了,也可以创建自己的元类

详细参考:https://www.cnblogs.com/ilovepython/p/11068850.html

def hello(self):
self.name = 'xiaoming'
print("hello world")
L = type('Lei',(object,),{'func':hello,'a':1})
print(L)
l = L()
print(l.a)
l.func()
print(l.name)

接下来就将写一个动态生成类的代码,用来动态生成每一个类:因为所有的model类都需要用到,因此,单独起一个form_handler.py文件,写在里边。

首先,静态生成modelform的方法如下:

class CustomerInfoModelForm(ModelForm):
class Meta:
model = models.CustomerInfo
fields = '__all__'

因此,生成一个动态的能够通用的modelfrom就使用上边的思路:1、动态传进来model,可以使用admin_class来传入,因为每一个admin_class都不一样,因此需要根据app_name和model_name来得到admin_class 2、然后动态生成即可

定义一个方法,使用type生成类::

python+Django CRM客户关系管理系统开发(七)--修改功能开发第17张

然后在视图函数中,返回生成的form:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第18张

到此,就能在页面上显示每个字段类型的form了

4、目前的显示,比较乱,先把显示格式修改一下,还是模仿admin,所有的项目一行行排列。

老样子,使用 https://v3.bootcss.com/css/#forms-horizontal

粘贴其中这一部分form-group代码过来:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第19张

其中,静态modelForm增加自定义样式的写法:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第20张

动态生成的写法:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第21张

前端页面修改如下:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第22张

效果如图:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第23张

5、修改功能开发完善:

目前显示的页面是没有要修改的对象的值的,每个框里有要修改对象的值了,才能修改,因此进行修改:

修改视图函数:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第24张

此时前端显示如下:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第25张

目前已经可以修改了,在加个保存按钮,即可保存:

从bootstrap上,将保存按钮复制过来

python+Django CRM客户关系管理系统开发(七)--修改功能开发第26张

python+Django CRM客户关系管理系统开发(七)--修改功能开发第27张

给form添加一个post的method

python+Django CRM客户关系管理系统开发(七)--修改功能开发第28张

修改视图函数

如果是进入修改页面,是get,如果修改完毕提交,是post请求,分情况来操作:

python+Django CRM客户关系管理系统开发(七)--修改功能开发第29张

form中还得添加csrf,要不然提交不成功

python+Django CRM客户关系管理系统开发(七)--修改功能开发第30张

目前,可以修改成功

免责声明:文章转载自《python+Django CRM客户关系管理系统开发(七)--修改功能开发》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python之路(第三十篇) 网络编程:socket、tcp/ip协议Java原型模式之浅拷贝-深拷贝下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python遍历List集合四种方法

这篇文章主要介绍了Python 列表(List) 的四种遍历方法实例 详解的相关资料,需要的朋友可以参考下 分别是:直接遍历对象 通过索引遍历 通过enumerate方法 通过iter方法。 使用Python遍历List四种方法代码如下: def text2(self): li = ['a', 'b', 'c', 'd', 'e'...

Python3 tkinter基础 Label justify 多行字符串左对齐

         Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda : 4.5.11    typesetting : Markdown   code """ @Author : 行初心 @Date : 18...

python之fabric(二):执行模式(转)

执行模式 执行模式可以让你在多个主机上执行多个任务。 执行策略: 默认fabric是单个有序地执行方法,其行为如下:       1. 创建一系列任务,通过fab任务执行要执行的任务;       2. 根据主机列表定义,去执行每一个任务;       3. 没有主机定义的任务,将在本地执行一次。 如: from fabric.api import run...

Python 编码简单说

先说说什么是编码。 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码。编码方案(encoding scheme)规定了字符串是如何编码的。 python编码,其实就是对python字符串的编解码问题,这也是为什么在python中,只有字符串,才有decode和encode方法。在python中,字符串为str类型,其父类为basestr...

关于反编译pyc的一点技巧

现在最流行的是用https://github.com/rocky/python-uncompyle6 但是有些python小版本不一样,比如2.7.6的某版本,开头的magic number在这个项目中没有收集 这时直接改开头的两字节magic number就可以反编译了 python2.7.16的是 03F3...

python-操作excel

python-操作excel 安装xlrd,xlwt pip install xlrd pip install xlwt 栗子 读取excel文件 import xlrd wb = xlrd.open_workbook('user_info.xlsx') sheets = wb.sheets() #sheet = sheets[0] #获取第一个shee...