简单解析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更新列表的方法
Jul 28 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
Python过滤列表用法实例分析
Apr 29 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
Python 读取图片文件为矩阵和保存矩阵为图片的方法
Apr 27 Python
利用pyinstaller将py文件打包为exe的方法
May 14 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
Django ORM 常用字段与不常用字段汇总
Aug 09 Python
python实现H2O中的随机森林算法介绍及其项目实战
Aug 29 Python
pytorch数据预处理错误的解决
Feb 20 Python
详解python中的异常和文件读写
Jan 03 Python
Python操作Excel的学习笔记
Feb 18 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
Admin generator, filters and I18n
2011/10/06 PHP
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
js wmp操作代码小结(音乐连播功能)
2008/11/08 Javascript
JS 常用校验函数
2009/03/26 Javascript
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
[01:29:46]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第二局
2016/02/27 DOTA
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
浅析Python多线程下的变量问题
2015/04/28 Python
Python 多线程实例详解
2017/03/25 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
python实现实时视频流播放代码实例
2020/01/11 Python
Python 从attribute到property详解
2020/03/05 Python
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
南非领先的在线旅行社:Travelstart南非
2016/09/04 全球购物
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
品学兼优的大学生自我评价
2013/09/20 职场文书
机械设计及其自动化专业推荐信
2013/10/31 职场文书
总经理助理工作职责
2014/02/06 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
中秋晚会策划方案
2014/06/12 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
水电工岗位职责
2015/02/14 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
python3中apply函数和lambda函数的使用详解
2022/02/28 Python