简单解析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的Flask框架中实现全文搜索功能
Apr 20 Python
Python获取linux主机ip的简单实现方法
Apr 18 Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
如何使用Python 打印各种三角形
Jun 28 Python
对django layer弹窗组件的使用详解
Aug 31 Python
python pygame实现挡板弹球游戏
Nov 25 Python
Python imageio读取视频并进行编解码详解
Dec 10 Python
Python系统公网私网流量监控实现流程
Nov 23 Python
Pytorch 图像变换函数集合小结
Feb 01 Python
Django+Celery实现定时任务的示例
Jun 23 Python
再谈python_tkinter弹出对话框创建
Mar 20 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
BBS(php &amp; mysql)完整版(八)
2006/10/09 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
php 多文件上传的实现实例
2016/10/23 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
JavaScript使用cookie
2007/02/02 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
JavaScript实现常用二级省市级联下拉列表的方法
2015/03/25 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
JS生成不重复的随机数组的简单实例
2016/07/10 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
python实现图片识别汽车功能
2018/11/30 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
基于Python组装jmx并调用JMeter实现压力测试
2020/11/03 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
linux系统都有哪些运行级别
2016/03/26 面试题
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
2014新年寄语
2014/01/20 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python
Java的Object类的九种方法
2022/04/13 Java/Android