简单解析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 functools模块学习总结
May 09 Python
Python 安装setuptools和pip工具操作方法(必看)
May 22 Python
python中map()函数的使用方法示例
Sep 29 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
Feb 05 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
关于Python-faker的函数效果一览
Nov 28 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
Jan 02 Python
解决pytorch DataLoader num_workers出现的问题
Jan 14 Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 Python
pytorch 如何使用amp进行混合精度训练
May 24 Python
Python 如何将integer转化为罗马数(3999以内)
Jun 05 Python
Python中的变量与常量
Nov 11 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+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
基于jquery实现的自动补全功能
2015/03/12 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
js电话号码验证方法
2015/09/28 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
js初始化验证实例详解
2016/11/26 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
React实践之Tree组件的使用方法
2017/09/30 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
node.js +mongdb实现登录功能
2020/06/18 Javascript
[02:17]DOTA2亚洲邀请赛 RAVE战队出场宣传片
2015/02/07 DOTA
[01:00]DOTA2 store: Collection of Artisan's Wonders
2015/08/12 DOTA
Python装饰器基础详解
2016/03/09 Python
python 连接各类主流数据库的实例代码
2018/01/30 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
播音主持专业个人自我评价
2014/01/09 职场文书
中学生期末评语
2014/02/03 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
大学生读书笔记大全
2015/07/01 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
Java使用JMeter进行高并发测试
2021/11/23 Java/Android
MySQL日期时间函数知识汇总
2022/03/17 MySQL