简单解析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实现二分查找算法实例
May 26 Python
python抽象基类用法实例分析
Jun 04 Python
Python 类与元类的深度挖掘 I【经验】
May 06 Python
python使用pymysql实现操作mysql
Sep 13 Python
python实现按长宽比缩放图片
Jun 07 Python
深入分析python中整型不会溢出问题
Jun 18 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
python调用c++传递数组的实例
Feb 13 Python
详解用python写网络爬虫-爬取新浪微博评论
May 10 Python
python aiohttp的使用详解
Jun 20 Python
简单了解python中对象的取反运算符
Jul 01 Python
使用pytorch实现论文中的unet网络
Jun 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中如何判断AJAX提交的数据
2012/02/05 PHP
php递归方法实现无限分类实例代码
2014/02/28 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
php-msf源码详解
2017/12/25 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
js截取固定长度的中英文字符的简单实例
2013/11/22 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
快速掌握jQuery插件WebUploader文件上传
2016/11/07 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
python多线程同步之文件读写控制
2021/02/25 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
工作建议书范文
2014/05/13 职场文书
村道德模范事迹材料
2014/08/28 职场文书
工作粗心大意检讨书
2014/09/18 职场文书