简单解析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获取赶集网招聘信息前篇
Apr 18 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
Python算法之图的遍历
Nov 16 Python
Django REST为文件属性输出完整URL的方法
Dec 18 Python
Python使用sorted对字典的key或value排序
Nov 15 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 Python
为什么相对PHP黑python的更少
Jun 21 Python
Python pip使用超时问题解决方案
Aug 03 Python
python 决策树算法的实现
Oct 09 Python
教你怎么用Python处理excel实现自动化办公
Apr 30 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 禁止页面缓存输出
2009/01/07 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
php检测url是否存在的方法
2015/04/14 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
理清apply(),call()的区别和关系
2011/08/14 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
2013/08/14 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
2017/03/23 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
python绘制铅球的运行轨迹代码分享
2017/11/14 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
python 实现检验33品种数据是否是正态分布
2019/12/09 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
python request 模块详细介绍
2020/11/10 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
大众服装店创业计划书范文
2014/01/01 职场文书
安全标准化实施方案
2014/02/20 职场文书
护士长竞聘演讲稿
2014/04/30 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
政府会议通知范文
2015/04/15 职场文书
2015年暑假工作总结
2015/07/13 职场文书
干部考核工作总结2015
2015/07/24 职场文书
python实现简单的三子棋游戏
2022/04/28 Python