这篇文章主要介绍了简单解析Django框架中的表单验证,Django是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>

最新资讯
微软(中国)在南昌启动微软云暨移动孵化计划

微软(中国)在南昌启动微

微软(中国)有限公司与南昌红谷滩新区10月20日签署战略合
腾讯与找钢网合资公司已正式成立 腾讯持股40%

腾讯与找钢网合资公司

记者独家获悉,腾讯与找钢网合资的胖猫云(上海)科技公司已
直击|盛大游戏CEO唐彦文:5G时代游戏行业将迎三巨变

直击|盛大游戏CEO唐彦

盛大游戏CEO唐彦文今日在2018年全球盛斗士大会上指出,5
优爱腾独播剧厮杀:爱奇艺弃播放量 腾讯改革会员体系

优爱腾独播剧厮杀:爱

影视行业电视收视率、网络平台播放量造假风波给行业带
奢侈手机品牌VERTU推新机:29800起,可远程删除数据

奢侈手机品牌VERTU推

国奢侈手机品牌VERTU发布全新ASTER P系列,该系列可远程
小牛上市,投资人还原创业故事,还评价了李一男

小牛上市,投资人还原创

明势资本是牛电科技天使轮领投方,在之后的每一轮都追加
最新文章
Python pygorithm模块用法示例【常见算法测试】

Python pygorithm模块

这篇文章主要介绍了Python pygorithm模块用法,结合实
Flask Web开发入门之文件上传(八)

Flask Web开发入门之

这篇文章主要为大家详细介绍了Flask Web开发入门之文
Django 登陆验证码和中间件的实现

Django 登陆验证码和

这篇文章主要介绍了Django 登陆验证码和中间件的实现,
django进阶之cookie和session的使用示例

django进阶之cookie和

这篇文章主要介绍了django进阶之cookie和session的使
Python引用计数操作示例

Python引用计数操作示

这篇文章主要介绍了Python引用计数操作,结合实例形式
python3 flask实现文件上传功能

python3 flask实现文

这篇文章主要为大家详细介绍了python3 flask实现文件