内容回顾:

修改的地方

(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. CSS--百度百科

    层叠样式表是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. CSS目前最新版本为CSS3,是能够真正做到网页表现与内容分离的一种样式设 ...

  2. Grow heap (frag case) to 6.437MB for 1114126-byte allocation

    本篇文章是对Grow heap (frag case) 堆内存过大的问题进行了详细的分析介绍,需要的朋友参考下 对于Android开发者来说虽然使用了可以自动管理内存的Java语言,但是对于内存管理不 ...

  3. (转)JavaScript: in, hasOwnProperty, delete, for/in

    in 运算符 判断对象是否拥有某一属性只要对象拥有该属性,就会返回true,否则false var point = { x:1, y:1 };alert( 'x' in point );  //tru ...

  4. 关于继承Fragment后重写构造方法而产生的错误

    在android开发中.写了一个关于继承Fragment的类时,假设有重载构造函数时.会提示"Avoid non-default constructors in fragments: use ...

  5. The user specified as a definer (&#39;root&#39;@&#39;%&#39;) does not exist

     通常是因为root用户对全局host无訪问权限.因此仅仅要给root用户加入一个訪问权限就可以. 解决的方法: 登陆mysql .运行 mysql -u root -pPasswd mysql ...

  6. 在CMD中查看端口被什么程序占用

    我们要查看端口被什么程序占用,可以使用下面方法.比如端口28848 1. 打开cmd,输入命令netstat -ano | findstr ":28848",显示结果如下,最后一个 ...

  7. 【设计模式 7】从公司的目前框架和API Gateway,谈谈对外观模式的理解

    我,第一次用到外观模式,应该是3年多以前.那时候是做一个收费系统,在当时的U层和B层之间,加了一层Facade.当时,在一些复杂的业务逻辑处理时,感受到了加入外观层的好处,但对于一些简单的(我指的是, ...

  8. sendmail发件人邮箱设定命令

    sendmail发件人邮箱设定命令   以前就碰到过设置发件人后缀的方式,这次迁移服务器居然忘记,从头开始记录下 1:第一种方法,修改/etc/hosts,据说sendmail使用hosts里面的本地 ...

  9. SpringBoot支持https和http

    1.application.propertites #server.port=8081 server.port: 8443 server.ssl.key-store: classpath:keysto ...

  10. Mysql之sync-binlog参数

    Mysql开启bin-log日志使用bin-log时,默认情况下,并不是每次执行写入就与硬盘同步,这样在服务器崩溃是,就可能导致bin-log最后的语句丢失. 可以通过这个参数来调节,sync_bin ...