简单解析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 中__name__ = '__main__' 的作用
Jul 05 Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
使用Template格式化Python字符串的方法
Jan 22 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 Python
Python3实现汉语转换为汉语拼音
Jul 08 Python
Python统计时间内的并发数代码实例
Dec 28 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
如何利用python 读取配置文件
Jan 06 Python
Pygame Time时间控制的具体使用详解
Nov 17 Python
asyncio异步编程之Task对象详解
Mar 13 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实现微信发红包功能
2018/07/13 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
js 动态加载事件的几种方法总结
2013/12/25 Javascript
JavaScript变量的作用域全解析
2015/08/14 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
Vue的路由动态重定向和导航守卫实例
2018/03/17 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
详解babel升级到7.X采坑总结
2019/05/12 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
原生js实现购物车功能
2020/09/23 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
HTML中使用python屏蔽一些基本功能的方法
2017/07/07 Python
查看Django和flask版本的方法
2018/05/14 Python
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
Python日志模块logging基本用法分析
2018/08/23 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
python argparser的具体使用
2019/11/10 Python
Python求解正态分布置信区间教程
2019/11/20 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
大学生职业生涯规划书模板
2014/01/03 职场文书
博士毕业生自我鉴定范文
2014/04/13 职场文书
公司捐款倡议书
2014/05/14 职场文书
借款协议书
2014/09/16 职场文书
2015年安全工作总结范文
2015/04/02 职场文书