简单解析Django框架中的表单验证


Posted in Python onJuly 17, 2015

我们的搜索示例仍然相当地简单,特别从数据验证方面来讲;我们仅仅只验证搜索关键值是否为空。 然后许多HTML表单包含着比检测值是否为空更为复杂的验证。 我们都有在网站上见过类似以下的错误提示信息:

  •     请输入一个有效的email地址, foo' 并不是一个有效的e-mail地址。
  •     请输入5位数的U.S 邮政编码, 123并非是一个有效的邮政编码。
  •     请输入YYYY-MM-DD格式的日期。
  •     请输入8位数以上并至少包含一个数字的密码。

关于JavaScript验证

可以使用Javascript在客户端浏览器里对数据进行验证,这些知识已超出本书范围。 要注意: 即使在客户端已经做了验证,但是服务器端仍必须再验证一次。 因为有些用户会将JavaScript关闭掉,并且还有一些怀有恶意的用户会尝试提交非法的数据来探测是否有可以攻击的机会。

除了在服务器端对用户提交的数据进行验证(例如在视图里验证),我们没有其他办法。 JavaScript验证可以看作是额外的功能,但不能作为唯一的验证功能。

我们来调整一下search()视图,让她能够验证搜索关键词是否小于或等于20个字符。 (为来让例子更为显著,我们假设如果关键词超过20个字符将导致查询十分缓慢)。那么该如何实现呢? 最简单的方式就是将逻辑处理直接嵌入到视图里,就像这样:

def search(request):
  error = False
  if 'q' in request.GET:
    q = request.GET['q']
    if not q:
      error = True
    **elif len(q) > 20:**
      **error = True**
    else:
      books = Book.objects.filter(title__icontains=q)
      return render_to_response('search_results.html',
        {'books': books, 'query': q})
  return render_to_response('search_form.html',
    {'error': error})

现在,如果尝试着提交一个超过20个字符的搜索关键词,系统不会执行搜索操作,而是显示一条错误提示信息。 但是,search_form.html里的这条提示信息是:”Please submit a search term.”,这显然是错误的, 所以我们需要更精确的提示信息:

<html>
<head>
  <title>Search</title>
</head>
<body>
  {% if error %}
    <p style="color: red;">Please submit a search term 20 characters or shorter.</p>
  {% endif %}
  <form action="/search/" method="get">
    <input type="text" name="q">
    <input type="submit" value="Search">
  </form>
</body>
</html>

但像这样修改之后仍有一些问题。 我们包含万象的提示信息很容易使人产生困惑: 提交一个空表单怎么会出现一个关于20个字符限制的提示? 所以,提示信息必须是详细的,明确的,不会产生疑议。

问题的实质在于我们只使用来一个布尔类型的变量来检测是否出错,而不是使用一个列表来记录相应的错误信息。 我们需要做如下的调整:

def search(request):
  **errors = []**
  if 'q' in request.GET:
    q = request.GET['q']
    if not q:
      **errors.append('Enter a search term.')**
    elif len(q) > 20:
      **errors.append('Please enter at most 20 characters.')**
    else:
      books = Book.objects.filter(title__icontains=q)
      return render_to_response('search_results.html',
        {'books': books, 'query': q})
  return render_to_response('search_form.html',
    {**'errors': errors** })

接着,我们要修改一下search_form.html模板,现在需要显示一个errors列表而不是一个布尔判断。

<html>
<head>
  <title>Search</title>
</head>
<body>
  **{% if errors %}**
    **<ul>**
      **{% for error in errors %}**
      **<li>{{ error }}</li>**
      **{% endfor %}**
    **</ul>**
  **{% endif %}**
  <form action="/search/" method="get">
    <input type="text" name="q">
    <input type="submit" value="Search">
  </form>
</body>
</html>
Python 相关文章推荐
Python中比较特别的除法运算和幂运算介绍
Apr 05 Python
python计算一个序列的平均值的方法
Jul 11 Python
Python中http请求方法库汇总
Jan 06 Python
Python2.7编程中SQLite3基本操作方法示例
Aug 09 Python
用Python登录好友QQ空间点赞的示例代码
Nov 04 Python
用python的turtle模块实现给女票画个小心心
Nov 23 Python
python有序查找算法 二分法实例解析
Feb 18 Python
Django实现后台上传并显示图片功能
May 29 Python
Python如何截图保存的三种方法(小结)
Sep 01 Python
运行python提示no module named sklearn的解决方法
Nov 29 Python
一文搞懂Python Sklearn库使用
Aug 23 Python
Python可视化学习之seaborn调色盘
Feb 24 Python
改进Django中的表单的简单方法
Jul 17 #Python
Python的Django框架中的表单处理示例
Jul 17 #Python
Python中max函数用法实例分析
Jul 17 #Python
详解Django中Request对象的相关用法
Jul 17 #Python
Python实现SVN的目录周期性备份实例
Jul 17 #Python
Python的Django框架中设置日期和字段可选的方法
Jul 17 #Python
Python的Django框架下管理站点的基本方法
Jul 17 #Python
You might like
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
CLASS_CONFUSION JS混淆 全源码
2007/12/12 Javascript
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
autoIMG 基于jquery的图片自适应插件代码
2011/03/12 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
javascript关于继承解析
2016/05/10 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
2016/06/06 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
angular十大常见问题
2017/03/07 Javascript
使用vue.js写一个tab选项卡效果
2017/03/25 Javascript
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
微信小程序模板和模块化用法实例分析
2017/11/28 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
python读写json文件的简单实现
2017/04/11 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
用pycharm开发django项目示例代码
2019/06/13 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
浅谈CSS3 动画卡顿解决方案
2019/01/02 HTML / CSS
工业自动化毕业生自荐信范文
2014/01/04 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers