简单解析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中的decode()方法的使用
May 18 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
单利模式及python实现方式详解
Mar 20 Python
python模糊图片过滤的方法
Dec 14 Python
python 读取鼠标点击坐标的实例
Dec 29 Python
python实现剪切功能
Jan 23 Python
python对文件的操作方法汇总
Feb 28 Python
python中的插入排序的简单用法
Jan 19 Python
如何用 Python 制作一个迷宫游戏
Feb 25 Python
python装饰器代码深入讲解
Mar 01 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 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配置心得包含MYSQL5乱码解决
2006/11/20 PHP
常用的php对象类型判断
2008/08/27 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
PHP中串行化用法示例
2016/11/16 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
详解Vue 开发模式下跨域问题
2017/06/06 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
通过fastclick源码分析彻底解决tap“点透”
2017/12/24 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
python网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
2014/04/25 Python
python简单实例训练(21~30)
2017/11/15 Python
pandas 使用均值填充缺失值列的小技巧分享
2019/07/04 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
利用python画出AUC曲线的实例
2020/02/28 Python
如何用python处理excel表格
2020/06/09 Python
纯CSS3实现Material Design效果
2017/03/09 HTML / CSS
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
市场营销专业毕业生自荐信
2013/11/02 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
参观邀请函范文
2015/02/02 职场文书
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis