简单解析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
Php多进程实现代码
May 07 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
Jan 17 Python
详解python调用cmd命令三种方法
Jul 08 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
Python程序控制语句用法实例分析
Jan 14 Python
使用Python实现Wake On Lan远程开机功能
Jan 22 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
Python3之外部文件调用Django程序操作model等文件实现方式
Apr 07 Python
用python画城市轮播地图
May 28 Python
LeetCode189轮转数组python示例
Aug 05 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中如何定义和使用常量
2013/02/28 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
js模块加载方式浅析
2017/08/12 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
基于React Native 0.52实现轮播图效果
2020/08/25 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
[01:00:30]TFT vs VGJ.T Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
Python中的类学习笔记
2014/09/23 Python
如何将python中的List转化成dictionary
2016/08/15 Python
python实现的正则表达式功能入门教程【经典】
2017/06/05 Python
python实现简易通讯录修改版
2018/03/13 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
QT5 Designer 打不开的问题及解决方法
2020/08/20 Python
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
三个Unix的命令面试题
2015/04/12 面试题
优秀团员个人的自我评价
2013/10/02 职场文书
管理失职检讨书
2014/02/12 职场文书
小学班级特色活动方案
2014/08/31 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
工作检讨书范文
2015/01/23 职场文书
辩论会主持词
2015/07/03 职场文书
运动会运动员赞词
2015/07/22 职场文书