巨蟒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,在进一步向crm\urls.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,然后走crm\urls.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.报名记录管理

posted @ 2019-03-15 10:53  studybrother  阅读(197)  评论(0编辑  收藏  举报