简单解析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 相关文章推荐
Fiddler如何抓取手机APP数据包
Jan 22 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
Python中标准库OS的常用方法总结大全
Jul 19 Python
win10下Python3.6安装、配置以及pip安装包教程
Oct 01 Python
python爬取淘宝商品销量信息
Nov 16 Python
python字符串Intern机制详解
Jul 01 Python
python psutil模块使用方法解析
Aug 01 Python
PyTorch实现AlexNet示例
Jan 14 Python
Python求两个字符串最长公共子序列代码实例
Mar 05 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
Python实现查找数据库最接近的数据
Jun 08 Python
python中count函数知识点浅析
Dec 17 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个人网站架设连环讲(一)
2006/10/09 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
JavaScript NodeTree导航栏(菜单项JSON类型/自制)
2013/02/01 Javascript
两个数组去重的JS代码
2013/12/04 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
最简单的JavaScript图片轮播代码(两种方法)
2015/12/18 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
基于Bootstrap分页的实例讲解(必看篇)
2017/07/04 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
基于Vue实现可以拖拽的树形表格实例详解
2018/10/18 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
总结Python编程中三条常用的技巧
2015/05/11 Python
Python3 批量扫描端口的例子
2019/07/25 Python
pytorch之添加BN的实现
2020/01/06 Python
python游戏开发的五个案例分享
2020/03/09 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
美国皮靴公司自1863年:The Frye Company
2016/11/30 全球购物
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
给学校的建议书范文
2014/05/15 职场文书
幼师求职自荐信
2015/03/26 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
婚礼嘉宾致辞
2015/07/28 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
html5表单的required属性使用
2021/07/07 HTML / CSS
SQL Server数据库备份和恢复数据库的全过程
2022/06/14 SQL Server