简单解析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入门篇之对象类型
Oct 17 Python
Python调用C++程序的方法详解
Jan 24 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
Django中使用Whoosh进行全文检索的方法
Mar 31 Python
Python实现数据结构线性链表(单链表)算法示例
May 04 Python
python解析yaml文件过程详解
Aug 30 Python
Python实现平行坐标图的绘制(plotly)方式
Nov 22 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
Python使用GitPython操作Git版本库的方法
Feb 29 Python
使用Python实现将多表分批次从数据库导出到Excel
May 15 Python
Python办公自动化之Excel(中)
May 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学习笔记 数组遍历实现代码
2011/06/09 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
php+mysql实现简单的增删改查功能
2015/07/13 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
2015/09/26 Javascript
javascript创建对象、对象继承的实用方式详解
2016/03/08 Javascript
self.attachevent is not a function的解决方法
2017/04/04 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
python安装与使用redis的方法
2016/04/19 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
python之DataFrame实现excel合并单元格
2021/02/22 Python
pandas 对每一列数据进行标准化的方法
2018/06/09 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
了解不常见但是实用的Python技巧
2019/05/23 Python
python读csv文件时指定行为表头或无表头的方法
2019/06/26 Python
python matplotlib如何给图中的点加标签
2019/11/14 Python
Python代码需要缩进吗
2020/07/01 Python
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
智能钱包:Ekster
2019/11/21 全球购物
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
纠纷协议书
2014/04/16 职场文书
服务标语大全
2014/06/18 职场文书
2014年司法局工作总结
2014/12/11 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书