简单解析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 相关文章推荐
Tornado Web服务器多进程启动的2个方法
Aug 04 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
Python for循环生成列表的实例
Jun 15 Python
设置python3为默认python的方法
Oct 31 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
Dec 18 Python
python实现公司年会抽奖程序
Jan 22 Python
Python list列表中删除多个重复元素操作示例
Feb 27 Python
Django实现文件上传下载
Oct 06 Python
用Python画小女孩放风筝的示例
Nov 23 Python
python队列原理及实现方法示例
Nov 27 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
python 绘制正态曲线的示例
Sep 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
php中字符串和正则表达式详解
2014/10/23 PHP
PHP解析目录路径的3个函数总结
2014/11/18 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
Javascript调用C#代码
2011/01/17 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
jquery交替变换颜色的三种方法 实例代码
2013/11/19 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
一些可能会用到的Node.js面试题
2019/06/15 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
PyQt5实现简单的计算器
2020/05/30 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
应届生保险求职信
2013/11/11 职场文书
自动化专业个人求职信范文
2013/11/29 职场文书
公司授权委托书样本
2014/09/15 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
会议通知格式范文
2015/04/15 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
python元组打包和解包过程详解
2021/08/02 Python
Vue的生命周期一起来看看
2022/02/24 Vue.js
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL