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


    一、本节目标

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

    二、功能分析

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

     

     

    三、功能开发

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

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

     获取id结果:

    因此修改tag:

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

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

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

     但是点击之后报错:

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

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

    正常跳转到修改页面:

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

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

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

    class Animal():
    pass

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

    使用type创建类:

           当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生成类::

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

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

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

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

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

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

    动态生成的写法:

    前端页面修改如下:

    效果如图:

    5、修改功能开发完善:

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

    修改视图函数:

    此时前端显示如下:

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

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

    给form添加一个post的method

    修改视图函数

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

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

    目前,可以修改成功

  • 相关阅读:
    将oh-my-zsh编程真正的my zsh
    Linux Shell 程序调试
    (64位)本体学习程序(ontoEnrich)系统配置说明文档
    Shell编程——vim常用命令
    Morris Traversal 方法遍历二叉树(非递归、不用栈,O(1)空间)
    206. Reverse Linked List
    欧几里德算法求解最大公约数
    25. Reverse Nodes in k-Group
    86. Partition List
    24. Swap Nodes in Pairs
  • 原文地址:https://www.cnblogs.com/realizetomoney/p/13903799.html
Copyright © 2020-2023  润新知