简单解析Django框架中的表单验证

yipeiwu_com6年前Python基础

我们的搜索示例仍然相当地简单,特别从数据验证方面来讲;我们仅仅只验证搜索关键值是否为空。 然后许多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 PIL/cv2/base64相互转换实例

PIL和cv2是python中两个常用的图像处理库,PIL一般是anaconda自带的,cv2是opencv的python版本。base64在网络传输图片的时候经常用到。 ##PIL...

Python+OpenCV实现实时眼动追踪的示例代码

Python+OpenCV实现实时眼动追踪的示例代码

使用Python+OpenCV实现实时眼动追踪,不需要高端硬件简单摄像头即可实现,效果图如下所示。   项目演示参见:https://www.bilibili.com/vide...

Python Web版语音合成实例详解

Python Web版语音合成实例详解

前言 语音合成技术能将用户输入的文字,转换成流畅自然的语音输出,并且可以支持语速、音调、音量设置,打破传统文字式人机交互的方式,让人机沟通更自然。 应用场景 将游戏场景中的公告、任务...

flask框架jinja2模板与模板继承实例分析

本文实例讲述了flask框架jinja2模板与模板继承。分享给大家供大家参考,具体如下: jinja2模板 from werkzeug.contrib.cache import Si...

python复制文件到指定目录的实例

周末出去爬山,照了一大堆照片回来,照片同时存储为jpg和DNG格式,我用adobe bridge将dng格式的照片中要保留的筛选出来后,就不想再对着一张张去挑jpg的照片了,于是用pyt...