内容回顾:

修改的地方

(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.模糊查询

需要一个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.报名记录管理

巨蟒django之CRM4 一些小功能的更多相关文章

  1. FasterRunner (httptunner+django)搭建以及小功能补充

    配置 下载地址https://github.com/httprunner/FasterRunner 后端配置https://www.jianshu.com/p/e26ccc21ddf2 前端配置htt ...

  2. Django开发简单采集用户浏览器信息的小功能

    Django开发简单采集用户浏览器信息的小功能 Centos环境准备 yum install –y python-pip export http_proxy=http://10.11.0.148:80 ...

  3. js小功能整理

    /** * 判断是否包含字符串某字符串 * @param {[type]} str [被检测的字符串] * @param {[type]} substr [检测是否含有的字符串] * @return ...

  4. iOS--知识综合应用成就时髦小功能点

    iOS--知识综合应用成就时髦小功能点

  5. Java实现点击一个Jlabel增加一个Jlabel的小功能

    当界面生成以后,自己想做一个点击一个Jlabel增加一个Jlabel,即类似于QQ的添加好友以后可以及时的加进一个好友.自己做了好久,发现不能及时刷新.在网上查了一下,然后自己研究了一小会.发现需要v ...

  6. Servlet的5种方式实现表单提交(注册小功能),后台获取表单数据

    用servlet实现一个注册的小功能 ,后台获取数据. 注册页面: 注册页面代码 : <!DOCTYPE html> <html> <head> <meta ...

  7. android 常用小功能(第二版)

    经历过一段岁月,转眼2013的半年都过去了,第二版整理好的小功能,答应大家发布的,直到今日,终于和大家相见了,第二版没有第一版多,大家也可以去参考第一版的内容,希望大家使用愉快! 目录: 1.获取当前 ...

  8. NSFileManager文件操作的十个小功能

    NSFileManager文件操作的十个小功能 NSFileManager是一个单列类,也是一个文件管理器.可以通过NSFileManager创建文件夹.创建文件.写文件.读文件内容等等基本功能. 下 ...

  9. javascript实现的一个信息提示的小功能/

    //什么状况.CSDN的排版怎么这么多状况,还是本人太次?调整几次都没弄好.最后一遍了-- 最近由于公司业务问题.须要做一些面向公众的平台,于是对UI要求会高一点, 对于传统的alert的这样的方式来 ...

随机推荐

  1. LInux——安装Apache

    在安装Apache的httpd的时候经常会遇到: configure: error: APR not found .  Please read the documentation. configure ...

  2. Linux 下动态查找磁盘数量方法

    #!/bin/bash ##磁盘数量 Disk=$( fdisk -l |grep 'Disk' |grep 'sd' |awk -F , '{print "%s",substr( ...

  3. Linux经常使用命令(十五) - which

    我们常常在linux要查找某个文件,但不知道放在哪里了.能够使用以下的一些命令来搜索: which  查看可运行文件的位置. whereis 查看文件的位置. locate   配合数据库查看文件位置 ...

  4. 谷歌Cartographer学习 -快速安装测试

    参考资料:https://www.cnblogs.com/hitcm/p/5939507.html PC下面进行安装: 遇到的问题如下 1.首先安装ceres solver 在编译的时候,如果是低配的 ...

  5. Struts Spring Plugin注意点

    Settings The following settings can be customized. See the developer guide. Setting Description Defa ...

  6. 同时安装office2016与visio2016的实现过程

    visio 2016安装问题 同时安装office2016与visio2016的实现过程 visio2016  but failed

  7. java 开发中的debug

    mysql 的 级联删除与级联更新 create table student( id int, departmentId int, foreign key(departmentId) referenc ...

  8. tcp/ip--IP 协议首部格式与其配套使用的四个协议(ARP,RARP,ICMP,IGMP)

    IP 数据报首部 最高位在左边,记为0 bit:最低位在右边,记为31 bit 版本: 占 4 位,指 IP 协议的版本目前的 IP 协议版本号为 4 (即 IPv4) 首部长度: 占4位,可表示的最 ...

  9. ReferenceError: Promise is not define

    尽管加入了babel-polyfill ,依然出现 [ReferenceError: Promise is not define]的问题.目前只在三星.金立手机出现这种问题.没办法,只能强行修复了. ...

  10. Android解决button反复点击问题

    public class BaseActivity extends Activity { protected boolean isDestroy; //防止反复点击设置的标志.涉及到点击打开其它Act ...