简单解析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查询IP地址归属完整代码
Jun 21 Python
Python获取CPU、内存使用率以及网络使用状态代码
Feb 08 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
Feb 07 Python
python实现AES加密与解密
Mar 28 Python
谈一谈基于python的面向对象编程基础
May 21 Python
python自动发邮件总结及实例说明【推荐】
May 31 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
python实现倒计时小工具
Jul 29 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
python3 assert 断言的使用详解 (区别于python2)
Nov 27 Python
opencv3/C++图像像素操作详解
Dec 10 Python
基于Django集成CAS实现流程详解
Nov 28 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处理json时中文问题的解决方法
2011/04/12 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
php绘制一条弧线的方法
2015/01/24 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
Smarty模板配置实例简析
2019/07/20 PHP
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
javascript中异常处理案例(推荐)
2016/10/03 Javascript
Vue数据监听方法watch的使用
2018/03/28 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
JS使用队列对数组排列,基数排序算法示例
2019/03/02 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
python实现进程间通信简单实例
2014/07/23 Python
Python微信公众号开发平台
2018/01/25 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
python文件写入write()的操作
2019/05/14 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
大学校园毕业自我鉴定
2014/01/15 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
2015年维修工作总结
2015/04/25 职场文书
大学学生会主席竞选稿
2015/11/19 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
Golang实现AES对称加密的过程详解
2021/05/20 Golang
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers