django实战项目 内容管理系统cms (八)视图层views.py4/4

小满:小满之日苦菜秀,又五日靡草死,又五日小暑至(麦秋生)。

2808

views中可能还需要给评论点赞的功能,这个请自行实现。

 

这篇文章将最后一个功能:注册

 定义authentication()函数

views.register并不难写,但是我们要实现一个酷一点的功能。

新用户注册时,输入用户名然后鼠标离开用户名这个框后我们要让程序判断这个用户名是否已经被注册,如果已被注册则提醒用户‘该用户名已被注册’,如果没有则提示‘该用户名可用’。

这样用户不致于用户名 邮箱 密码都填完了才得知用户名不可用,那样的体验并不好。

如果你细心的话,会发现我们的forms.py中有这么一行代码:

渲染到注册页面(register.html,此文件请自行编写) 则有onblur =’authentication()‘ ,这个onblur是html语法中指定鼠标离开这个元素所执行的js函数,相关查阅 这里,

我们在register.html头部插入以下代码:

定义authentication()函数,虽然只是一个函数,但是涉及到了js,jQuery, AJAX, 所以我们一步步讲:

‘var raw_username‘ 定义一个变量,document.getElementById(“username”).value 得到用户输入的用户名。

$.ajax是jQuery AJAX 方法,参阅 这里, 这个方法会以post的方式传递一个数据{‘raw_username’: raw_username} 给相应的处理函数。

编辑views.register

第2,3行,定义两个错误提示信息。我们使用了django的forms模块,它里面有自带的错误提示信息(如表单为空,邮箱地址不合法等错误提示),所以我们不用在定义其它错误提示信息。

第5行,还是要先判断request方法。

第10行,注意:request是post请求时有两种情况:一是AJAX发送的post请求,另一个是用户提交表单点击了注册这个按钮发送的post请求,所以要判断一下。如果是AJAX发送的post请求,则会传递一个{‘raw_username’: raw_username}数据,而如果是点击了注册按钮,则不会有raw_username这个数据,是这样吗?  好吧,是这样的。因为如果用户输入了用户名然后直接点击了注册按钮,按理说是会同时收到两个post请求,即包含raw_username的post,又有表单提交含有username的post(这里比较难以理解,慢慢消化),但实际上只会收到第二个包含username及其它表单信息的post。所以只要收到数据raw_username,就证明post请求来自AJAX,我们就要让程序判断是否已存在这个用户名(11-16行判断程序)。

这里我们试着用谷歌浏览器开发者工具查看相关的请求request所携带的数据data,谷歌开发者工具使用,请查看 这里

屏幕快照 2016-06-29 上午10.40.17

最下方就会显示form data的信息。

有时候页面显示的并不是实时的response,我们可以查看开发者工具的‘response’

屏幕快照 2016-06-29 上午10.48.07

这里就会看到页面真实的response,显示了‘this name is already exist’。

第18-32行,如果用户名可以注册,判断其它项是否合法,最后新建一个NewUser 。

 

12 条评论

  • yiguxianyun 2016年9月20日 回复

    “渲染到注册页面(register.html,此文件请自行编写)”……从git上下载了源文件里面有已经有register.html了,但是在注册页面填了“username”之后,鼠标点击到其他地方,什么都没发生,貌似ajax没有起作用,大神,点解啊?

    • D.Roger 2016年9月20日 回复 作者

      用谷歌开发者工具 查找原因。

      • yiguxianyun 2016年9月21日 回复

        大神,用谷歌看了,register这个页面填了username后,在Request Headers下面没有Form Date!!!
        ……点了“Submit”后倒是可以看到Form Date!!!俺诊断不了呀!!!

  • yiguxianyun 2016年9月21日 回复

    另外想请大神指点迷津:
    编程只懂点皮毛,但是想自己做个B/S结构的信息管理系统,学习了下django似乎还有很多功能需要自己动手定制:
    更细粒度的权限控制(每个销售员只能看到自己询价的项目,经理可以看到所有人的),表单的工作流控制(销售员填询价表→技术支持选型报价→销售员向客户报价(表单到了这个阶段就不允许任何人再编辑报价表))……暂时没这个能力自己实现
    ……
    看了下openERP应该已经提供了这些功能,只需要自己再按需要定制就可以,但是中文开发手册太少了,估计难度也不小
    …………所以,django还是openERP,大神帮忙指条明路~~
    ……
    另外,之前“技术支持水泵选型”的结果是通过excel体现的,我通过excel的VBA调用AutoCAD把excel的数据提取过去画的水泵的“性能曲线图”……所以想请教能不能通过网页运行VBA把网页的数据提取到AutoCAD画图?

    • D.Roger 2016年9月21日 回复 作者

      不了解, 给不了建议。

  • cxh 2016年9月23日 回复

    能给下源代码的github下载地址吗。谢谢

    • D.Roger 2016年9月23日 回复 作者

      下一篇 有地址

  • 哇哈哈 2016年10月12日 回复

    已经学习完,非常感谢!

    有一个问题倾角下,

    可以注册普通用户,但是无法登陆! 管理员可以注册和登陆!

    注册时的那个AJAX好像不起作用?

    实在找不到原因,楼主能否回答解决下啊,非常感谢啊!

    • D.Roger 2016年10月12日 回复 作者

      怎么无法登录,提示了什么错误吗?
      ajax那个 ,你是否用谷歌开发者工具的‘response’查看过?

      • 王狐狸 2016年11月13日 回复

        1、通过首页注册的用户无法登录是因为注册时,是明文保存的密码。所以authenticate自动登录时,密码不正确,user 是 None,通不过。
        2、ajax 那个按照教程处理后,提交ajax 的 post 时,会发生403错误。我按教程加入了 csrf.js之后还是会403,提示是 django 的 csrf 验证失败。

        麻烦博主回复下。

  • 王狐狸 2016年11月13日 回复

    1、通过首页注册的用户无法登录是因为注册时,是明文保存的密码。所以authenticate自动登录时,密码不正确,user 是 None,通不过。
    2、ajax 那个按照教程处理后,提交ajax 的 post 时,会发生403错误。我按教程加入了 csrf.js之后还是会403,提示是 django 的 csrf 验证失败。

    麻烦博主回复下。

    • D.Roger 2016年11月13日 回复 作者

      根据具体的错误提示 谷歌一下吧, 我没遇到过。

发表评论

电子邮件地址不会被公开。 必填项已用*标注