• 巨蟒django之CRM4 一些小功能


    内容回顾:

     修改的地方

    (1)

    (2)

    (3)

    (4)

    (5)

     整体回顾前几天内容:

    现在可以登录的原因,session内部存储了信息

    这个时候我们再访问刚才的地址,会发现,跳转到了登录页面login

    程序进来走的顺序是先走中间件,再走路由匹配,当然最前边还有一个WSGI

     在settings.py里边有自己的中间件.

     

    进入到这个中间件,会先执行process_request方法,当前访问的地址是crm/index/,前边两个if条件都不满足,所以需要向下继续走,

    从session中获取到pk,也就是获取到这个主键ID,因为从来没有登陆过,所以这个地方pk的值就是None,接下来再做查询,依然查不到,所以

    user也是None,结果判断 not None结果就是true了,所以进行返回的是login进行重定向到登录页面login.也就是这里的是重定向响应

    location=/crm/login/的响应头,得到这个地址之后,再向这个地址发送请求,这是再走一遍中间件,到达函数process_request然后是第一个if,

    条件成立,我们直接就像后边走了,也就是路由匹配,也就是匹配到了crm,在进一步向crmurls.py里边匹配,拿到login,也就是login的视图函数,

    login第一次是get请求,也就是直接返回页面,login.html,这样就结束了

    这时候,我们再输入用户名和密码:

    alex@qq.com&&1234567

    进入下面的页面:

    相当于是向登录地址,发送了1个POST请求,现在,我们依然走的是中间件,依然是在第一个中间件的if开始,走项目里边的urls,再找到对应APP里边的urls.py

    再次拿到login的视图函数:

    这个时候的请求方式是POST,

     

    首先是拿到用户名&&密码,然后做MD5加密,筛选密码和用户,向数据库中查询,如果查到了,说明用户名和密码没有问题,is_active=True并且是一个可登录的状态

    如果上图中的obj里边的筛选条件is_active=True,如果在数据库中给它改成False,那么即使正确也是查找不到的,能查到表示用户名和密码以及登录状态是没有问题的,

    接下来request.session['pk']=obj.pk表示将数据存储到session当中,后边还会用到.,存进去之后,后边又是一个重定向对象,到首页index,这时候我们再次走中间件,这个时候,两个if都不走,

    拿到刚才存储到session里边的pk,然后从数据库中拿到这个UserProfile第一个对象,如果没有拿到也就重新重定向到login,如下图所示:,拿到的话,

    request.user_obj=user这个对象,赋值完之后,继续走下面的路由匹配,

    这个时候走的时候,crm/index

     

    最后这个页面有用到了继承layout.html

    由此,我们登录就拿到了这个页面crm/index

     

    这个过程就是"登录"以及"校验"的中间件,需要将登录的用户查出来,将pk查出来,拿到用户的对象进行赋值request.obj,后边以便使用这个东西,

    这个时候,我们就可以访问"客户库"和"我的客户"这两个内容,点击"客户库,相当于向(http://127.0.0.1:8000/crm/customer_list/)"发送请求,因为现在处于登录状态,所以,可以访问其他页面

     

     因为是登录状态,就不需要走中间件了,点击客户库相当于是向(crm/customer_list/)发送了一个请求,

    正常走项目里边的urls.py,然后走crmurls.py里边的customer_list/,以及my_customer这两个路径,

    然后走,类CustomerList里边的方法:也就是get方法,通过点击事件GET请求,路径里边的as_view(),通过反射进行处理得到,拿到customer.py里边的get(也就是CBV),

    判断,如果是"公户地址"需要查询出所有公户,

     

    也就相当于是上边的销售的id可以是空的,表示是公户,下面看另一种写法:

    page=Pagination...表示分页功能,然后在render里边的all_customer里边进行了分页,然后交给模板"customer_list.html"进行渲染,然后根据需求展示所有的数据,

     

    上边如果显示的是get_sex_display,得到的结果是0,1这个时候,我们需要用到django自身存在的方法,这样会拿到choices里边的第二个元素,也就是男或女,但是我们需要知道,数据库中存储的是第一个元素,

    这个是外键的字段,也就是拿到销售的对象,customer.consultant,指的是UserProfile内的所有内容,通过这个外键接口

    我们可以通过给类自己定义str方法,拿到名字:

    最后拿到的结果也就是return后边的内容

    如果将str注释掉,拿到的结果是:

     

    注意,这个后边的return也可以写成self.password,这样我们得到的就是密码,但是显示在前端上的结果会是密文的.

     

    上边,我们看一下班级,

    我们得到的结果是,多对多的字段,拿到的是班级关系对象,

    总结:从多向一的方向拿,拿到的是直接的对象,但是反过来,从一的方向向多的方向拿,这个时候拿不到一个具体的对象,这个时候需要管理对象帮助我们进行操作,反向查询通过表名_set,进行查询,set是个集合的意思,从少向多的方向拿,拿的是一个管理对象,通过这个管理对象,进行相关的操作,多对多的关系,不管是拿拿一个,都是多对多的,all方法是拿到所有的对象,通过customer.class_list,也就是当前班级的所有对象,但是拿到这个结果是queryset对象,一次我们自己定义方法,控制显示的结果

     

    这个时候前端的下图,结果是通过表名执行拿show_class方法里边的内容,i就是拿到的班级管理对象,

    这个时候,我们再找下图所示的班级列表,根据自己的想法写,那结果如下图

    在"customer表"里边还有一个show_status显示状态的内容,返回的不只是字符串,还需要有代码,就需要通过定义这种形式,需要自己自定制这个内容,在全段或者后端加上mark_safe过滤器进行过滤,

    这个时候,得到的就是各种显示情况:

    上边是公户的情况,与私户的区别是什么?查找的数据是不一样的

    也就是过滤条件是不一样的,

    consultant=request.user_obj,也就是说,这个销售consultant等于当前登录的用户名,直接就可以拿到当前登录的用户,等于request.user_obj是在中间件中操作的,也就是直接拿到当前的用户,进行筛选,就拿到当前销售的用户了,

    公户变私户和私户边公户又是如何实现的呢?最简单的操作如何处理?

    就是将销售列表内的内容进行添加或者删除字段,为了简单将上边的,公户变私户和私户变公户写在一起,

    也就是加了一个select框:

    在select中起了一个名字name="action",并且进行判断,实现

    并且给每个用户加上checkbox

    我们将select和checkbox都包裹在form表单里边,

    通过用字符串,进行反射的方法,进行处理

     在CustomerList类里边先获取到,要进行的操作在方法post里边如下图所示,然后再用到反射,获取方法再执行,

    具体的操作包括两个,公户变私户和私户变公户,

     方式二是通过反向查询的

     注意:用到remove方法是允许当前字段为空才可以,

     

    上边还有两个,一个是添加,另一个是编辑,用到form组件,进行处理,也就是modelform

    下面展示顺序:

    上边的路由匹配,没有进行分组,所以就不会向后边的customer_change传递参数,

    也就是说,后边的edit_id就是空的,

    这个时候,因为edit_id=None,所以查询出来的结果就是空,也就是说obj=None,因为是GET请求,所以下面的走else,也就是说instance=None

    然后再交给return里边的form_obj进行渲染,

    传递的title,需要进行三元运算之后,再传递return进行渲染,

     

    render方法进行处理field,field表示直接显示input框,

     也就是上边的field.id_for_label//field.label//field.errors.0,也就是直接渲染出,添加客户的效果,点击保存发送POST请求,

    上图是将提交过来的数据,进行一一校验,最后得到结果.

    一个字段一个字段进行校验.如果没有问题,form_obj就是True,然后保存,最后返回

     编辑功能,同样是,开始的路由

    然后走到上图的编辑页面,捕获到,下图中的参数:

    然后跳转到,视图函数customer_change,

     

    这个时候edit_id=1,查找到obj,然后是POST请求,然后,在if里边的数据request.POST和instance=obj进行提交数据,接下来在判断提交的数据

    是否有问题,没有问题,我们就进行提交数据,提交完数据之后再重定向到上图所示的customer_list页面,

    回顾:
    1.添加客户
    2.编辑客户
    3.公户和私户的展示
    4.公户和私户的转化
    
    今日内容:
    1.模糊查询
    2.分页保留原搜索条件
    3.新增和编辑后跳转到原页面
    4.跟进记录管理
    5.报名记录管理

    1.模糊查询

     需要一个input框,输入内容,然后点击搜索,下面就搜索到相对应的信息.不符合信息的就不再显示了?如何做?

    主要是ORM操作,

    上图显示的是,一个是销售为空,另一个是销售等于请求的request.user_obj,(某一个具体的销售),现在我们需要做的是,再筛选出一些额外的东西,

     思考,如何筛选?

     

    这样,我们就筛选出了qq中含有12的账号:

     这个时候,我们只能qq条件,现在我们还需要条件,是应该是并列的还是其他的?

    name或qq  ,最后是个且的关系与销售.

    还原:

    点击进去:修改

    在a标签下面再添加一个form

    运行,得到下图的结果:

    我们在进行用样式进行渲染一下.

    运行:

    将搜索框和搜索放在一行

    运行:

     

    将搜索框放在右侧:

    运行:

    再处理一下,在添加的a标签加上一层div

    运行:搜索框和input框向下移动了一行.

    输入内容,点击搜索:显示在;浏览器的输入框中了.

    这个 时候,就走到了下图所示的get里边了

     

    注意上面这个路由的写法:

    上边画红线的是且的意思,我们需要对其进行修改,

    新添加的一条语句是query=request.GET.get('query')

    我们搜索aabc,什么都搜索不到

     搜索qq号含有12

    搜索名字中含有"武"的信息:

    这样就可以得到了,任意字段需要自己添加,

    下面我们换一种实现方法:

    现在我们将原来的信息拿走,重新定义一个方法,

     

    下面,我们看一下新的Q的写法,点击Q

    点击进入,super里边的__init__

    connector在这里表示的是连接符的意思.

     这样就表示下面的Q条件之间的关系是"或"的关系.

     

    这样下面的四句等于上面的一句,进行封装,有条件之后只需要加一句就可以了,注意这个q是小写

    下面我们在get函数里边进行调用:

    运行:

     

    上图存在问题是,不能用空值进行查询

    现在,我们需要添加一个字段的类表在search里边

    我们需要在上边进行查询

    下面,我们需要将下面的search函数里边的qq和name换一下,再换一种写法

    再换一种写法:

    位置传参:

     

    这样依然可以运行:

    如果想要添加额外的字段,只需要在列表中添加就可以了

    如果写性别的话,应该怎样处理?

    如何解决上边的错误,大黄页?在search函数中的get中,再加上一个空字符串

    这个时候就可以查出来了

    我们对dadonggua修改一下性别,改成"女"

    这样就出来了:

    注意,我们搜索的类型:搜索的是sex_type里边的第一个字段属性

     总结:

     

    2.分页保留原搜索条件

    3.新增和编辑后跳转到源页面

    4.跟进记录管理

    5.报名记录管理

  • 相关阅读:
    AngularJS in Action读书笔记4(实战篇)——创建Statistic模块
    AngularJS in Action读书笔记3——走近Services
    AngularJS in Action读书笔记2——view和controller的那些事儿
    AngularJS in Action读书笔记1——扫平一揽子专业术语
    Nodejs学习笔记(四)——支持Mongodb
    Nodejs学习笔记(三)——一张图看懂Nodejs建站
    Nodejs学习笔记(二)——Eclipse中运行调试Nodejs
    Nodejs学习笔记(一)——初识Nodejs
    Unity Shader 获取模型空间坐标
    Unity Shader 修改自定义变量的值
  • 原文地址:https://www.cnblogs.com/studybrother/p/10535619.html
Copyright © 2020-2023  润新知