内容回顾:
修改的地方
(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.报名记录管理